什么是VUE
- 什么是: 第三方开发的基于MVVM设计模式的渐进式的纯前端js框架
(1). 第三方: 下载
(2). 基于MVVM: 稍后重点讲
(3). 渐进式: 非常容易和其它技术融合,可逐步在项目中使用vue,而不要求必须整体替换!
(4). 纯前端js: 不需要任何后端技术,就可独立开发和运行
(5). 框架:
a. 什么是: 已经包含部分核心功能的半成品代码,缺少个性化定制。
b. 为什么: 避免重复编码
c. 原生DOM vs jQuery vs Vue
![]
- 何时: 今后绝大多数以数据操作(增删改查)为主的PC端或移动端项目都可用vue开发
比如: 美团,饿了么,淘宝,知乎,大众点评,微博...
二. 如何使用VUE
- 下载: 2种:
(1). 简单: 去官网下载vue.js文件,引入网页中——适合于初学者入门(3天)
cn.vuejs.org
(2). 复杂: 通过脚手架代码使用——综合,标准化,适合公司开发之用(2天)
- 第一个vue程序: 3步:
(0). 也需要先引入vue.js
<script src="js/vue.js">
(1). 先定义增强版界面: (HTML+CSS)
a. 要求1: 整个界面要用一个唯一的父元素包裹起来,习惯上都用<div id="app">
b. 要求2: 找到界面中将来可能发生变化的位置,用{{自定义变量名}}特殊语法标记出来
c. 要求3: 找到界面中可以点击的位置绑定事件处理函数: @事件名="自定义处理函数名"
(2). 创建一个Vue类型的对象来监视页面中的内容
(3). 在Vue中定义好页面所需的一切资源: 变量+事件处理函数
a. 页面所需的所有变量,都必须保存在data属性中,且以对象属性形式保存
b. 页面所需的所有事件处理函数,都必须保存在methods属性中,且以对象方法形式保存
- 示例: 使用vue实现点击+/-按钮,修改数量:
1_first_jq.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/jquery-1.11.3.js"></script>
</head>
<body>
<button>-</button><span>0</span><button>+</button>
<script>
//点+ 数量+1
//DOM 4步
//1. 查找触发事件的元素
//查找内容中包含+的button元素
$("button:contains(+)")
//2. 绑定事件处理函数
.click(function(){
//3. 查找要修改的元素
//本例中: 查找当前按钮的前一个元素span
var $span=$(this).prev();
//4. 修改元素
//4.1 取出元素的旧内容,并转为整数
var n=parseInt($span.html());
//4.2 计算新值: 将n+1
n++;
//4.3 将新值再放回去
$span.html(n);
});
//点- 数量-1
//DOM 4步
//1. 查找触发事件的元素
//查找内容中包含-的button元素
$("button:contains(-)")
//2. 绑定事件处理函数
.click(function(){
//3. 查找要修改的元素
//本例中: 查找当前按钮的后一个元素span
var $span=$(this).next();
//4. 修改元素
//4.1 取出元素的旧内容,并转为整数
var n=parseInt($span.html());
//4.2 计算新值:
//如果n>0,才能-1
if(n>0){
n--;
}
//否则什么也不干
//4.3 将新值再放回去
$span.html(n);
});
</script>
</body>
</html>
运行结果:
2_first_vue.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<!--1. 先定义增强版界面(HTML+CSS)
要求1: 整个界面要用一个唯一的父元素包裹起来,习惯上都用<div id="app">
要求2: 找到界面中将来可能发生变化的位置,用{{变量名}}特殊语法标记出来
本例中: 点+/-号,span元素的内容会发生变化
要求3: 找到界面中可以点击的位置绑定事件处理函数
//本例中: 点button +,执行+1(add)操作, 点button -, 执行-1(minus)操作
-->
<div id="app">
<button @click="minus">-</button>
<span>{{n}}</span>
<button @click="add">+</button>
</div>
<script>
//2. 创建一个Vue类型的对象来监视页面中的内容
//问题: 监视哪儿?
//解决: 用el属性:"选择器",为new Vue指明要监视的范围。el是element的缩写,指要监视的元素
new Vue({
el:"#app", //new Vue只负责id为app的div内的元素
//3. 在Vue中定义好页面所需的一切资源: 变量+事件处理函数
//3.1 页面所需的所有变量,都必须保存在data属性中,且以对象属性形式保存
data:{
//因为界面上需要一个变量n,所以这里需要些一个n支持页面
n:0 //起始值为0
},
//3.2 页面所需的所有事件处理函数,都必须保存在methods属性中,且以对象方法形式保存
methods:{
//因为界面上需要两个事件处理函数add和minus
//所以这里需要定义两个方法
add(){//add:function(){
//vue中的事件处理函数不需要做任何DOM操作,只需要专心操作data中的变量即可
//强调: vue中methods中的方法要使用data中的变量,必须加this.
this.n++
//结果: new Vue会自动将n变量的新值放到页面上
},
minus(){//minus:function(){
//如果当前n>0,才n--
if(this.n>0){ this.n-- }
}
}
})
</script>
</body>
</html>
运行结果:
MVVM设计模式:
- 什么是: 对前端代码的重新划分
- 为什么:
(1). 旧的前端代码分为三部分:
a. HTML: 仅包含网页内容的静态代码
b. CSS: 仅包含网页样式的静态代码
c. JS: 负责一切网页内容、属性和样式的变化
(2). 问题:
a. HTML和CSS缺少程序必要的要素: 没有变量,没有分支,没有循环,HTML和CSS几乎生活不能自理!任何一点变化,都要靠js来完成
b. js要负责HTML和CSS中几乎所有变化,导致大量重复的代码和繁琐的步骤! - MVVM如何重新划分前端代码: 依然3部分:
(1). 界面(View): 增强版的HTML+CSS
a. HTML中可以使用变量了
b. HTML中可以使用分支和循环了
(2). 模型对象(Model): 专门保存界面所需的所有变量和事件处理函数的对象
a. 专门保存界面所需的一切变量的对象,称为data
b. 专门保存界面所属的一切事件处理函数的对象,称为methods
(3). 视图模型(ViewModel): 一种专门自动将模型对象中的数据和函数与界面中保持同步 的特殊的程序
Vue框架如何实现MVVM设计模式的: Vue的绑定原理
(1). 引入vue.js时,其实是引入了一种类型Vue
(2). 如果向使用vue框架做开发,必须都要创建new Vue()对象
(3). new Vue()刚创建时,先把模型对象的data和methods中的数据引入到new Vue()对象中。
a. 先将data中的原变量隐姓埋名,半隐藏,再自动给data中每个变量请访问器属性(保镖)冒名顶替。结果: 今后,在任何位置只要使用变量,其实使用的都是访问器属性,已经不可能直接使用原变量了!
b. 在每个变量的访问器属性中的set函数中,都内置了一个通知函数。
c. 结果: 将来只要试图修改访问器属性表示的变量时,都会触发set中的通知,来通知整个框架,哪个变量被修改了!
d. 然后,new Vue()会将methods中的事件处理函数,全部打散。导致methods中的所有事件处理函数,变成直接隶属于new Vue()对面的方法!
e. 结果:
1). methods中的函数要想使用new Vue()中访问器属性表示的变量,必须加this.
2). methods中的函数中的this,默认都指向当前new Vue()对象
(4). 当new Vue()的data,methods和访问器属性都创建完毕后,new Vue()开始扫描el属性所指向的页面区域
a. 扫描过程中,只会将可能发生变化的元素保存在一个集合中。
这个仅保存可能变化的少量的元素的集合,称为虚拟DOM树
b. 首次扫描时,new Vue()会将data中的变量值首次自动更新到对应的元素上
c. 今后new Vue()中任何一个变量一旦别修改,都会自动触发set函数中的通知函数,通知函数就会向虚拟DOM树发送通知.
d. 一旦虚拟DOM树接到某个变量发生变化的通知之后,就会重新扫描"虚拟DOM树",快速找到受本次变量变化影响的元素。并用变量的新值,自动更新元素的内容。

5. 总结:
vue的绑定原理: 访问器属性+虚拟DOM树
- 虚拟DOM树的优点:
(1). 小: 只包含可能变化的元素。
(2). 遍历查找快
(3). 修改效率高: 只修改受影响的元素。不受影响的元素,一点儿也不改!
(4). 避免重复编码: 已经封装了增删改查操作!程序员无需手动编写增删改查代码。 - 总结: vue功能的开发步骤: 3步
(1). 先创建增强版的界面
(2). 再创建new Vue()对象,其中el:指向new Vue()要监控的区域
(3). 在new Vue()对象内定义模型对象data和methods
a. 所有界面所需的变量都放在data中
b. 所有界面所需的事件处理函数都放在methods中
总结:
- MVVM: 界面View+模型Model+视图模型ViewModel
- Vue绑定原理: 访问器属性+虚拟DOM树
变量被修改时: 访问器属性发出通知,虚拟DOM树扫描并仅更新受影响的元素
- 虚拟DOM树优点:
(1). 小: 只包含可能变化的元素。
(2). 遍历查找快
(3). 修改效率高: 只修改受影响的元素。
(4). 避免重复编码: 已封装DOM增删改查代码
- Vue功能3步:
(1). 先创建增强版的界面:
a. 可能变化的元素内容用{{自定义变量名}}标记
b. 触发事件的元素用@click="自定义处理函数名"标记
(2). 再创建new Vue()对象,其中el:指向new Vue()要监控的页面区域
(3). 在new Vue()对象内定义模型对象data和methods
a.界面所需的所有变量都放在data中
b.界面所需的所有事件处理函数都放在methods中
一. 绑定语法:
学名 Interpolation 插值语法、填空
- 问题: 旧DOM和jq中,程序中的变量虽然发生了变化,但是界面不会自动更新,必须依靠js手工将变量的新值更新到页面,导致大量重复的增删改查操作!
- 解决: VUE中让HTML中也支持变量了!做到程序中的变量变化,HTML界面中的显示自动变化!
- 什么是绑定语法: 让HTML中也支持变量的一种专门的语法格式
- 何时: 只要HTML中有的元素内容需要随变量自动变化时,都要用绑定语法
- 如何: <元素>xxxx{{自定义变量名}}xxxx</元素>
- 原理: 当new Vue()扫描页面时,只要扫描到{{}}这种语法,就会将{{}}中的js变量或表达式的值计算出来,再替换{{}}的位置最终显示给用户。
- {{}}中可以放什么,不能放什么?和ES6的模板字符串${}规定是完全一样的!
(1). 可以放: 变量,运算,三目,有返回值的函数调用,创建对象,访问数组元素
(2). 不能放: 程序结构(分支和循环),也不能放没有返回值的函数调用!
- 示例: 使用{{}}将程序中的变量值加工后,显示到界面上
1_{{}}.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<!--1. 先做界面-->
<div id="app">
<h3>用户名:{{uname}}</h3>
<!--如果 性别==1,就显示"男",否则 就显示"女"-->
<h3>性别:{{sex==1 ? "男" : "女"}}</h3>
<!-- 单价 x 数量 按2位小数四舍五入-->
<h3>小计:¥{{(price*count).toFixed(2)}}</h3>
<!--新建日期对象,保存毫秒数,并转为当地时间的字符串格式-->
<h3>下单时间: {{
new Date(orderTime).toLocaleString()
}}</h3>
<h3>今天星期{{week[new Date().getDay()]}}</h3>
</div>
<script>
//2. 创建new Vue()对象监控id为app的区域
new Vue({
el:"#app",
//3. 创建模型对象保存页面所需的所有变量
data:{
uname:"dingding",
sex:1,//性别
price:12.5,//单价
count:5,//数量
orderTime:1595296375921,//下单时间
week:["日","一","二","三","四","五","六"]
// 0 1 2 3 4 5 6
// ↑
// 2
//new Date().getDay()
//创建日期对象
//并自动获得当前系统时间
// 获得星期对应的数字
}
})
</script>
</body>
</html>
运行结果:
二. 指令: 13种
- 问题: {{}}可让元素的内容随变量自动变化,但是页面中可能发生变化的不止是内容!元素的属性和样式也可能发生变化!但是{{}}只支持内容变化,不支持属性值和样式变化!
- 解决: 指令
- 什么是: 指令就是为HTML元素添加更多新功能的特殊属性!
- 何时: 今后只要希望给HTML添加更多新功能,比如分支,循环等等,都要用指令来实现
- 包括:
(1). v-bind:
a. 什么是: 专门让属性值也能根据变量值自动变化
b. 何时: 今后只要希望属性值也能根据变量值自动变化时,都用v-bind
c. 如何: <元素 v-bind:属性名="变量或js表达式">
d. 强调: 一旦使用了v-bind,""中就不要再加{{}}了!""就承担了{{}}的作用!
e. 简写: 其实今后v-bind: ,只需要写:即可!v-bind可省略 !
<元素 :属性名="变量或js表达式">
f. 原理: 当new Vue()扫描到v-bind: 或 : 时会自动计算""中的变量值或js表达式的值,将计算后的新值,作为该属性的属性值!
g. 示例: 根据pm25的数值显示不同的图片
2_v-bind.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<!--1. 做界面-->
<div id="app">
<!--想实现根据空气质量pm25的数值,修改页面中img元素显示的人物表情-->
<!--
//如果pm25<100,则使用img/1.png
pm25<100 ?'img/1.png':
//否则如果pm25<200,则使用img/2.png
pm25<200?'img/2.png':
//否则如果pm25<300,则使用img/3.png
pm25<300?'img/3.png':
//否则,其它情况,都使用img/4.png
'img/4.png'
-->
<h3>空气质量: {{
pm25<100?'img/1.png':
pm25<200?'img/2.png':
pm25<300?'img/3.png':
'img/4.png'
}}</h3>
<!--<img v-bind:src="-->
<img :src="
pm25<100?'img/1.png':
pm25<200?'img/2.png':
pm25<300?'img/3.png':
'img/4.png'
" alt="">
</div>
<script>
//2. 创建new Vue()对象监控id为app的区域
new Vue({
el:"#app",
//3. 创建模型对象保存界面所需的变量
data:{
pm25:350
}
})
</script>
</body>
</html>
运行结果:
(2). v-show:
a. 什么是: 专门根据一个条件控制一个元素的显示隐藏的指令
b. 何时: 今后只要控制一个元素显示隐藏,都用v-show
c. 如何: <元素 v-show="bool变量或js条件表达式">
d. 原理: 当new Vue()扫描到v-show时,会自动计算""中变量或表达式的bool值。 1). 如果计算结果为true,则什么也不做,当前元素默认显示。
2). 如果计算结果为false,则自动给当前元素加display:none,则当前元素隐藏。
e. 示例: 使用vue控制对话框显示隐藏
3_v-show.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
<style>
.alert{
position:fixed;
width:400px;
height:200px;
background-color:#afa;
top:50%;
left:50%;
margin-left:-200px;
margin-top:-100px;
}
.alert>a{
position:absolute;
right:10px;
top:10px;
padding: 5px 10px;
border:1px solid blue;
}
</style>
</head>
<body>
<!--1. 做界面-->
<div id="app">
<!--点击按钮可以让对话框显示-->
<button @click="show">click me</button>
<!--本例中: 希望点按钮对话框div才显示,点x对话框div就隐藏,所以需要控制对话框div的显示和隐藏状态,
所以需要一个自定义变量isShow:
isShow为true时,对话框才显示
isShow为false时,对话框就隐藏 -->
<div v-show="isShow" class="alert">
<!--点×可以隐藏对话框-->
<a href="javascript:;" @click="hide">×</a>
</div>
</div>
<script>
//2. 创建new Vue()对象,监控id为app的区域
new Vue({
el:"#app",
//3. 创建模型对象,保存界面所需的所有变量
data:{
isShow:false //开局,对话框默认不显示
},
//因为页面中需要两个事件处理函数,所以
methods:{
show(){
this.isShow=true;
},
hide(){
this.isShow=false;
}
}
})
</script>
</body>
</html>
运行结果:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。