目录
Vue
前端发展史
# 1 HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 -> 在浏览器中查看
-ECMAScript 6 ECMAScript 6(简称ES6)是于2015年6月正式发布的JavaScript语言的标准
-ES13--->标准
-js=ecma+bom+dom
-sass,typescript。。。
# 2 Ajax(异步JavaScript和XML)的出现 -> 后台发送异步请求,Render+Ajax混合
-$.ajax
-XMLHttpRequest 原生ajax
# 3 单用Ajax(加载数据,DOM渲染页面):前后端分离的雏形
# 4 Angular框架的出现(1个JS框架):出现了“前端工程化”的概念(前端也是1个工程、1个项目)
# 5 React、Vue框架:当下最火的2个前端框架(Vue:国人喜欢用,React:外国人喜欢用)
# 6 移动开发(Android+IOS) + Web(Web+微信小程序+支付宝小程序) + 桌面开发(Windows桌面):前端 -> 大前端
# 7 一套代码在各个平台运行(大前端):谷歌Flutter(Dart语言:和Java很像)可以运行在IOS、Android、PC端
-前端用flutter后端用python写好不好
# 8 在Vue框架的基础性上 uni-app:一套编码 编到10个平台
# 9 在不久的将来 ,前端框架可能会一统天下
vue介绍
Vue
版本:Vue2.x
和Vue3.x
,本内容基于Vue2
知识讲解。
Vue
(读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架
M-V-VM 架构思想
MVVM 是Model-View-ViewModel
的缩写,它是一种基于前端开发的架构模式,是一种事件驱动编程方式
# M-V-VM 架构思想 MVC MTV MVVC MVP移动端架构
-M:Model 数据层 vue对象的data属性里面的数据,这里的数据要显示到页面中
-V:View 视图层 vue中数据要显示的HTML页面,在vue中,也称之为“视图模板” (HTML+CSS)
-VM:ViewModel vue中编写代码时的vm对象,它是vue.js的核心,负责连接 View 和 Model数据的中转,保证视图和数据的一致性,所以前面代码中,data里面的数据被显示中p标签中就是vm对象自动完成的(双向数据绑定:JS中变量变了,HTML中数据也跟着改变)
# 作用:以后页面变,js变量就变,js变量变,页面就变
组件化开发、单页面开发
- 组件化开发,以后都是写出一个个组件,组件的组合成页面
- 单页面开发(单页面应用):
spa:single-page application,一个HTML页面
MVVM的特性
- 低耦合:
视图
(View)可以独立于Model变化和修改
,1个ViewModel可以绑定到不同的View上,当View变化的时候 Model可以不变,当Model变化的时候 View也可以不变 - 可复用:可以把一些视图逻辑放在1个ViewModel中,让很多View
重用这端视图的逻辑
(以此减少代码冗余) - 独立开发:
开发
人员可以专注于业务逻辑
和数据的开发
(ViewModel),设计
人员可以专注于页面设计
- 可测试:界面元素是比较难以测试的,而现在的测试可以
针对ViewModel
来编写
版本
-
1.x版本---使用的较少
-
2.x版本---普遍使用较多
-
3.x 版本---出了很久,公司新项目会选择
注:语法有差距,但是
Vue3
完全兼容Vue2
,可以在Vue3
上写Vue2
,但是官方不建议了
Vue的特点
# 易用
通过 HTML、CSS、JavaScript构建应用
# 灵活
不断繁荣的生态系统,可以在一个库和一套完整框架之间自如伸缩。
# 高效
20kB min+gzip 运行大小
超快虚拟 DOM
最省心的优化
js数组常用方法
https://blog.csdn.net/u012451819/article/details/125768796
Vue js的框架
引入Vue的两种方式
-
下载Vue2源码,下载到本地
<script src="./js/vue.js"></script>
-
直接导入Vue的CND
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
实例
1. vue2源码,下载到本地----》js代码
2. html中引入,写vue语法
3.vue语法
<script>
new Vue({
el:'#app',
data:{
name:'lqz'
}
}) 实例
</script>
xss攻击
dtl的选择器
插值语法
M-V-VM演示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="static/vue.js"></script>
</head>
<body>
<div id="app">
<p>姓名:{{name}}</p>
<p>age:{{age}}</p>
</div>
</body>
<script>
var vm = new Vue({
el:'#app',
data:{ // data中定义的变量,以后直接从vm实例直接可以拿到
name:'kiki',
age:18
}
})
</script>
</html>
插值语法
在Vue中,python的三元表达式成为三目运算符。插值语法中可以放变量【对象取值,数组取值】、简单的js语法、函数()
注意:插值不能写在标签的属性上,只能写在标签内部
插值语法:{{}}
插值语法对应的结果
js | 插值语法的用法 |
---|---|
变量名name | {{name}} |
数组hobby:['奶茶','水果','水果捞'] | 索引取值:{{hobby[1]}} |
对象:friend: | 对象点:{{friend.name}} |
链接:a_url:'百度' | 插值语法是字符串 |
实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="static/vue.js"></script>
</head>
<body>
<div id="app">
<p>名字:{{name}}</p>
<p>年龄:{{age}}</p>
<p>年龄:{{hobby}}----->第一个爱好:{{hobby[1]}}</p>
<p>朋友:{{friend}}----->朋友姓名:{{friend.name}}---朋友的年纪:{{friend.age}}</p>
<p>标签(默认不会渲染成标签):{{a_url}}</p>
<p>函数()</p>
</div>
</body>
<script>
var vm = new Vue({
el:'#app',
data:{
name:'kimi',
age:18,
hobby:['奶茶','水果','水果捞'],
friend:{name:'fifi',age:28}
// 运算
a_url:'<a href="http://www.baidu.com">百度</a>'
}
})
console.log(vm)
</script>
</html>
文本指令
v-xx 写在任意标签属性上,不用加{
指令 | 释义 | 举例 |
---|---|---|
v-html | 让HTML渲染成页面 | <p v-html="a_url"></p> |
v-text | 标签内容显示js变量对应的值 | <p v-text="a_url"></p><br/> 同 <p>{{a_url}}</p> |
v-show | 放1个布尔值:true->标签就显示;false->标签就不显示 | style="display: none;" 样式控制显示 |
v-if | 放1个布尔值:true->标签就显示;false->整个标签之间删除,效率低,在dom中删除标签 |
注意:a_url
必须是data
中定义的变量
v-show与 v-if的区别
v-show
:标签还在,只是不显示了(display: none)v-if
:直接操作DOM,删除/插入 标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="static/vue.js"></script>
</head>
<body>
<div id="app">
<h2>v-text</h2>
<p v-text="a_url"></p> <!-- 得到字符串-->
<h2>v-html</h2>
<p v-html="a_url"></p> <!-- 得到百度链接-->
<h2>v-show</h2>
<img v-show="show" src="https://img0.baidu.com/it/u=1914588600,2165521099&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800" alt="" height="150px" width="200px">
<h2>v-if</h2>
<div v-if="show_if">
<img v-if="show_if" src="https://img2.baidu.com/it/u=2841588310,2443646494&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800" alt="" height="150px" width="200px">
</div>
</div>
</body>
<script>
var vm = new Vue({
el:'#app',
data:{
a_url:'<a href="http://www.baidu.com">百度</a>',
show:true,
show_if:true
}
})
</script>
</html>
属性指令
标签上的属性可以绑定变量,以后变量变化属性的值也跟着变化
href
src
name
class
style
height
.......
标签的属性绑的是date里面的变量名,变量名的变化就是标签属性值的变化
语法
v-bind:属性名="变量名"
可简写成 :属性名="变量名"
指令 | 释义 |
---|---|
v-bind | 直接写js的变量或语法(不推荐) |
: | 直接写js的变量或语法(推荐) |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="static/vue.js"></script>
</head>
<body>
<h2>v-bind</h2>
<div id="app" >
<img v-bind:src="phone" alt="" :height="h" :width="w">
</div>
</body>
<script>
var vm = new Vue({
el:'#app',
data:{
a_url:'<a href="http://www.baidu.com">百度</a>',
phone:"https://img2.baidu.com/it/u=2841588310,2443646494&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800",
h:"150px",
w:"200px"
}
})
</script>
</html>
事件指令
事件指令是指:点击事件/双击事件/滑动事件,最常用的是点击事件click
指令 | 释义 | 例子 |
---|---|---|
v-on | 触发事件(不推荐) | v-on:click="handleClick" |
@ | 触发事件(推荐) | @事件名='函数' |
@[event] | 触发event事件(可以是其他任意事件) |
v-on:事件名='函数'
<button v-on:click="handleClick">图片展示</button>
函数必须写在methods的配置项中
methods:{
'handleClick':function (){
// alert('图片展示')
console.log(this) // this 就是当前vue实例,就是vm实例
this.show=!this.show
},
}
注意:点击button就会触发绑定函数(handleClick)的执行
实操
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="static/vue.js"></script>
</head>
<body>
<!-- <h2>点击事件--点击按钮显示图片</h2>-->
<!-- <div id="box">-->
<!-- <img :src="url" alt="" :width="w" :height="h">-->
<!-- <button @click="handleClick">图片显示</button>-->
<!-- </div>-->
<!-- <h2>点击事件--切换图片</h2>-->
<!-- <div id="box">-->
<!-- <img :src="url" alt="" :width="w" :height="h">-->
<!-- <button @click="handleClick">切换图片</button>-->
<!-- </div>-->
<h2>点击事件--定时器</h2>
<div id="box">
<img :src="url" alt="" :width="w" :height="h">
<button @click="handleClick">开始自动切换图片</button>
</div>
</body>
<script>
var vm = new Vue({
el:'#box',
data:{
a_url:'<a href="http://www.baidu.com">百度</a>',
show:true,
url:"https://img0.baidu.com/it/u=1914588600,2165521099&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800",
url_list:[
"https://img1.baidu.com/it/u=3137839583,1268792578&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=300",
"https://img0.baidu.com/it/u=1914588600,2165521099&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800",
"https://img0.baidu.com/it/u=924177493,4128380787&fm=253&fmt=auto&app=138&f=JPEG?w=720&h=480",
"https://img1.baidu.com/it/u=2366849520,302709710&fm=253&fmt=auto&app=138&f=JPEG?w=505&h=300",
],
h:"150px",
w:"200px"
},
//绑定点击按钮,控制show的显示
// methods:{
// handleClick(){
// // alert("图片展示")
// console.log(this)
// this.show =! this.show //取反操作
// }
// }
// 点击随机图片展示
// methods:{
// 'handleClick':function (){
// var i = Math.round(Math.random()*(this.url_list.length -1))
// this.url = this.url_list[i]
// console.log(i)
//
// }
// }
//定时器切换图片
// methods:{
// 'handleClick':function (){
// var _this = this
// setInterval(function (){
// var i = Math.round(Math.random()*(_this.url_list.length -1))
// _this.url = _this.url_list[i]
// console.log(i)
// },1000) // 1s更新一次
//
//
// }
// }
//简写
methods:{
handleClick(){
console.log('hahh')
var _this = this
setInterval(function (){
var i = Math.round(Math.random()*(_this.url_list.length - 1))
_this.url = _this.url_list[i]
console.log(i)
},1000)
}
}
})
案例---点击按钮,随机切换照片
-1 methods配置项中写成 这种形式 es6的对象写法
handleClick() {}
如果函数中再套函数,如何内部不是箭头函数,this指向有问题,需要在外部定义一下
var _this = this
class和style
两者区别
# class:推荐用数组
:class='变量'
变量可以是字符串,数组,对象
# style:推荐用对象
:style='变量'
变量可以是字符串,数组,对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="static/vue.js"></script>
<style>
.font {
font-size: 20px;
}
.red {
background-color: red;
}
.green {
background-color: green;
}
.font-color {
color: yellow;
}
</style>
</head>
<body>
<div id="app">
<h2>class</h2>
<div :class="class_list">我是class---div</div>
<h2>style</h2>
<div :style="style_obj">我是style---div</div>
</div>
</body>
<script>
var vm = new Vue({
el:'#app',
data:{
// class_str:'font',//字符串 前端修改vm.class_str='font red'
class_list:['font'], //推荐 前端修vm.class_list=['font','red']
// class_obj:{font:true,green:true,'font-color':false},
// style_str:'color:green;font-size:40px'
// style_list:[{color:'yellow'},{'font-size':'40px'}]
// style_list:[{color:'yellow'},{fontSize:'40px'}] // 可以用驼峰
// style_obj:{color:'yellow',fontSize:'50px'} // 可以用驼峰
style_obj:{color:'yellow','font-size':'50px'}
}
})
</script>
</html>
条件渲染
指令 | 释义 |
---|---|
v-if | 相当于: if |
v-else | 相当于:else |
v-else-if | 相当于:else if |
# v-if=条件 放在标签上,如果条件成立,该标签就现实,如果条件不成立,该标签就不显示
# v-else-if=条件 放在标签上,如果条件成立,该标签就现实,如果条件不成立,该标签就不显示
# v-else 放在标签上,上面条件都不成立,显示这个标签
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="static/vue.js"></script>
</head>
<body>
<div id="app">
<h>分数显示文字</h>
<div v-if="score>=90">优秀</div>
<div v-else-if="score<=90&&score>=80">良好</div>
<div v-else-if="score<=80&&score>=60">及格</div>
<div v-else>不及格</div>
</div>
</body>
<script>
var vm = new Vue({
el:'#app',
data:{
score:99
}
})
</script>
</html>
列表渲染
v-if+v-for+v-else控制购物车商品的显示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="static/vue.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body>
<div id="app">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<div class="text-center">
<h1>v-if + v-for 显示购物车</h1>
<button @click="handleClick">点我显示表格</button>
</div>
<div v-if="show">
<table class="table table-hover">
<thead>
<tr>
<th>id</th>
<th>商品名</th>
<th>商品价格</th>
</tr>
</thead>
<tbody>
<tr v-for="item in good_list">
<th scope="row">{{item.id}}</th>
<td>{{item.name}}</td>
<td>{{item.price}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
<script>
var vm = new Vue({
el:'#app',
data:{
show:false,
good_list: [
{id: 1, name: '钢笔', price: '29'},
{id: 2, name: '铅笔', price: '29'},
{id: 3, name: '文具盒', price: '298'},
{id: 4, name: '彩笔', price: '298'},
]
},
methods:{
handleClick(){
this.show =! this.show
}
}
})
</script>
</html>
补充
- 解释器ide: 集成开发环境,快速开发。
- 解释器有
pycharm
,goland
和vscode
- django template language 的模板语法简称
dtl