文章目录
vue简介
1.什么是vue
官方给出的概念:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的前端框架。
-
构建用户界面:
– 用vue往html页面中填充数据 -
框架
– 框架是一套现成的解决方案,程序员只能遵守框架的规范,去编写自己的业务功能
– 学习vue,就是在学习vue框架中规定的用法
– vue的指令,组件、路由、vuex
2.vue的特性
vue 框架的特性,主要体现在如下两方面:
① 数据驱动视图
② 双向数据绑定
2.1 数据驱动视图
在使用了 vue 的页面中,vue 会监听数据的变化,从而自动重新渲染页面的结构。示意图如下:
好处:当页面数据发生变化时,页面会自动重新渲染!
注意:数据驱动视图是单向的数据绑定
。
2.2 双向数据绑定
在网页中,form表单负责采集数据,ajax负责提交数据;js数据变化,会被自动渲染到页面上;页面上表单采集的数据发生变化的时候,会被vue自动获取,并更新到js数据中。
在填写表单时,双向数据绑定可以辅助开发者在不操作 DOM 的前提下,自动把用户填写的内容同步到数据源
中。示意图如下:
好处:开发者不再需要手动操作 DOM 元素,来获取表单元素最新的值!
2.3 MVVM
MVVM 是 vue 实现数据驱动视图和双向数据绑定的核心原理。MVVM 指的是 Model、View 和 ViewModel,
它把每个 HTML 页面都拆分成了这三个部分,如图所示:
在 MVVM 概念中:
Model
表示当前页面渲染时所依赖的数据源。
View
表示当前页面所渲染的 DOM 结构。
ViewModel
表示 vue 的实例,它是 MVVM 的核心。
2.4 MVVM的工作原理
ViewModel 作为 MVVM 的核心
,是它把当前页面的数据源(Model)和页面的结构(View)连接在了一起。
当数据源发生变化
时,会被 ViewModel 监听到,VM 会根据最新的数据源自动更新页面的结构
当表单元素的值发生变化
时,也会被 VM 监听到,VM 会把变化过后最新的值自动同步
到 Model 数据源中
3. vue版本
当前,vue 共有 3 个大版本,其中:
2.x 版本的 vue 是目前企业级项目开发中的主流版本
3.x 版本的 vue 于 2020-09-19 发布,生态还不完善,尚未在企业级项目开发中普及和推广
1.x 版本的 vue 几乎被淘汰,不再建议学习与使用
总结:
3.x 版本的 vue 是未来企业级项目开发的趋势;
2.x 版本的 vue 在未来(1 ~ 2年内)会被逐渐淘汰;
vue的基本使用
1. 基本使用步骤
① 导入 vue.js 的 script 脚本文件
② 在页面中声明一个将要被 vue 所控制的 DOM 区域
③ 创建 vm 实例对象(vue 实例对象)
<body>
<!-- 填充数据 -->
<div id="app">
{{ username }}
</div>
<!-- 1.导入vue的库文件,在window全局就有了vue这个构造函数 -->
<script src="./lib/vue-2.6.12.js"></script>
<!-- 2.创建vue实例 -->
<script>
const vm = new Vue({
// el 属性固定写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
el: '#app',
// data 对象就是要渲染的数据
data:{
username: 'zhansan'
}
})
</script>
</body>
2. 基本代码与MVVM的对应关系
vue的调试工具
1. 安装vue-devtools调试工具
vue 官方提供的 vue-devtools 调试工具,能够方便开发者对 vue 项目进行调试与开发。
Chrome 浏览器
在线安装 vue-devtools :
https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd
FireFox 浏览器
在线安装 vue-devtools :
https://addons.mozilla.org/zh-CN/firefox/addon/vue-js-devtools/
2. 配置Chrome浏览器中的vue-devtools
略…
3. 使用vue-devtools调试vue页面
略…
vue的指令与过滤器
1. 指令的概念
指令(Directives)
是 vue 为开发者提供的模板语法
,用于辅助开发者渲染页面的基本结构
。
vue 中的指令按照不同的用途
可以分为如下 6 大类:
① 内容渲染
指令
② 属性绑定
指令
③ 事件绑定
指令
④ 双向绑定
指令
⑤ 条件渲染
指令
⑥ 列表渲染
指令
注意:指令是 vue 开发中最基础、最常用、最简单的知识点。
1.1 内容渲染指令
内容渲染指令
用来辅助开发者渲染 DOM 元素的文本内容
。常用的内容渲染指令有如下 3 个:
- v-text
- {{ }}
- v-html
1.1.1 v-text
用法示例:
<p v-text="username"></p>
<p v-text="gender">性别:</p>
注意:v-text 指令会覆盖元素内默认的值
。
1.1.2 {{ }} 语法
vue 提供的 {{ }}
语法,专门用来解决 v-text 会覆盖默认文本内容的问题。这种 {{ }} 语法的专业名称是插值表达式
(英文名为:Mustache
)。
<p >姓名:{{username}}</p>
<p >性别:{{gender}}</p>
注意:相对于 v-text 指令来说,插值表达式在开发中更常用一些!
因为它不会覆盖元素中默认的文本内容。
1.1.3 v-html
v-text
指令和插值表达式
只能渲染纯文本内容
。如果要把包含 HTML 标签的字符串
渲染为页面的 HTML 元素,
则需要用到 v-html 这个指令:
<div v-html="info"></div>
最终渲染的结果为:
1.2 属性绑定指令
如果需要为元素的属性
动态绑定属性值
,则需要用到 v-bind
属性绑定指令。用法示例如下:
<input type="text" v-bind:placeholder="tips"/>
<hr>
<!-- vue 规定 v-bind 指令可以简写 : -->
<img v-bind:src="photo" width="100px" height="100px">
1.2.1 属性绑定指令的简写形式
由于 v-bind 指令
在开发中使用频率非常高,因此,vue 官方为其提供了简写形式
(简写为英文的 : )。
<input type="text" :placeholder="tips"/>
<hr>
<!-- vue 规定 v-bind 指令可以简写 : -->
<img :src="photo" width="100px" height="100px">
1.2.2 使用 Javascript 表达式
在 vue 提供的模板渲染语法中,除了支持绑定简单的数据值
之外,还支持 Javascript 表达式的运算
,例如:
<body>
<!-- 填充数据 -->
<div id="app">
<input type="text" v-bind:placeholder="tips"/>
<hr>
<!-- vue 规定 v-bind 指令可以简写 : -->
<img v-bind:src="photo" width="100px" height="100px">
<hr>
<div>1+2 的结果是:{{1+2}}</div>
<div>{{tips}} 反转结果是:{{tips.split('').reverse().join('')}}</div>
<div :title="'box' + index">这是一个div </div>
</div>
<!-- 1.导入vue的库文件,在window全局就有了vue这个构造函数 -->
<script src="./lib/vue-2.6.12.js"></script>
<!-- 2.创建vue实例 -->
<script>
const vm = new Vue({
// el 属性固定写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
el: '#app',
// data 对象就是要渲染的数据
data:{
tips: '请输入用户名',
photo: 'https://cn.vuejs.org/images/logo.svg',
index: 3
}
})
</script>
</body>
1.3 事件绑定指令
vue 提供了 v-on 事件绑定
指令,用来辅助程序员为 DOM 元素绑定事件监听。语法格式如下:
<p>count的值:{{ count }}</p>
<button v-on:click="add">+1</button>
注意:原生 DOM 对象有 onclick、oninput、onkeyup 等原生事件,替换为 vue 的事件绑定形式后,
分别为:v-on:click
、v-on:input
、v-on:keyup
通过 v-on 绑定的事件处理函数,需要在 methods 节点中进行声明:
const vm = new Vue({
el: '#app',
data:{
count: 0
},
// methods: 定义事件的处理函数
methods:{
// add: function() {
// console.log("ok")
// }
// 简写
add() {// 事件处理函数的名字
// this 表示当前new出来的vm实例对象
// 通过this 可以访问到data中的数据
this.count += 1
console.log(vm===this)
}
}
})
1.3.1 事件绑定的简写形式
由于 v-on 指令
在开发中使用频率非常高,因此,vue 官方为其提供了简写形式
(简写为英文的 @ )。
<p>count的值:{{ count }}</p>
<!-- 在绑定事件处理函数的时候,可以使用()传参 -->
<button v-on:click="add(2)">+1</button>
<!-- v-on指令可以被简写为@ -->
<button @click="add(2)">+1</button>
1.3.2 事件参数对象
在原生的 DOM 事件绑定中,可以在事件处理函数的形参处,接收事件参数对象 event。同理,在 v-on 指令
(简写为 @
)所绑定的事件处理函数中,同样可以接收到事件参数对象 event
,示例代码如下:
<p>count的值:{{ count }}</p>
<button @click="add">+</button>
//--------------分割线----------------
methods:{
// 若不传参,默认有个e元素
add(e) {
this.count += n
if(this.count % 2 ===0){
e.target.style.backgroundColor = 'red'
} else {
e.target.style.backgroundColor = ''
}
}
}
1.3.3 绑定事件并传参
在使用 v-on 指令绑定事件时,可以使用( )
进行传参,示例代码如下:
<p>count的值:{{ count }}</p>
<!-- 在绑定事件处理函数的时候,可以使用()传参 -->
<!-- v-on指令可以被简写为@ -->
<button @click="add(2)">+1</button>
// ---------------分割线--------------------
methods:{
add(n) {
this.count += n
console.log(vm===this)
}
}
1.3.4 $event
$event
是 vue 提供的特殊变量
,用来表示原生的事件参数对象 event
。$event 可以解决事件参数对象 event
被覆盖的问题。示例用法如下:
<p>count的值:{{ count }}</p>
<button @click="add(1, $event)">+</button>
//--------------分割线----------------
methods:{
// 若不传参,默认有个e元素
add(n,e) {
this.count += n
if(this.count % 2 ===0){
e.target.style.backgroundColor = 'red'
} else {
e.target.style.backgroundColor = ''
}
}
}
1.3.5 事件修饰符
在事件处理函数中调用 event.preventDefault()
或 event.stopPropagation()
是非常常见的需求。因此,
vue 提供了事件修饰符的概念,来辅助程序员更方便的对事件的触发进行控制
。常用的 5 个事件修饰符如下:
事件修饰符 | 说明 |
---|---|
.prevent | 阻止默认行为 (例如:阻止 a 连接的跳转、阻止表单的提交等) |
.stop | 阻止事件冒泡 |
.capture | 以捕获模式触发当前的事件处理函数 |
.once | 绑定的事件只触发1次 |
.self | 只有在 event.target 是当前元素自身时触发事件处理函数 |
语法格式如下:
<a href="http://www.baidu.com" @click.prevent="show">百度</a>
1.3.6 按键修饰符
在监听键盘事件时,我们经常需要判断详细的按键。此时,可以为键盘相关的事件添加按键修饰符,例如:
<input type="text" @keyup.esc="clearInput" @keyup.enter="submit">
1.4 双向绑定指令
vue 提供了 v-model 双向数据绑定指令
,用来辅助开发者在不操作 DOM
的前提下,快速获取表单的数据
。
<select v-model="city">
<option value="">请选择</option>
<option value="1">北京</option>
<option value="2">上海</option>
<option value="3">广州</option>
</select>
注意:只能操作表单元素
- input输入框
- type=“radio”
- type=“checkbox”
v-model 指令的修饰符
为了方便对用户输入的内容进行处理
,vue 为 v-model 指令提供了 3 个修饰符,分别是:
修饰符 | 作用 | 示例 |
---|---|---|
.number | 自动将用户的输入值转为数值类型 | '<input v-model.number=“age” ’ |
.trim | 自动过滤用户输入的首尾空白字符 | <input v-model.trim=“msg” |
.lazy | 在“change”时而非“input”时更新 | <input v-model.lazy=“msg” |
示例用法如下:
<input type="text" v-model.number="n1"> + <input type="text" v-model.number="n2"> = <span> {{n1+n2 }}</span>
1.5 条件渲染指令
条件渲染指令用来辅助开发者按需控制 DOM 的显示与隐藏。条件渲染指令有如下两个,分别是:
- v-if
- v-show
示例用法如下:
<div id="app">
<p v-if="flag">v-if控制</p>
<p v-show="flag">v-show 控制</p>
</div>
1.5.1 v-if 和 v-show 的区别
实现原理不同:
- v-if 指令会
动态地创建或移除 DOM 元素
,从而控制元素在页面上的显示与隐藏; - v-show 指令会动态为元素
添加或移除 style="display: none;" 样式
,从而控制元素的显示与隐藏;
性能消耗不同:
v-if
有更高的切换开销
,而 v-show
有更高的初始渲染开销
。因此:
- 如果需要
非常频繁地切换
,则使用 v-show 较好 - 如果在
运行时条件很少改变
,则使用 v-if 较好
实际开发过程中无需考虑,使用v-if
1.5.2 v-else
v-if 可以单独使用,或配合 v-else 指令一起使用:
<div v-if="Math.randow() > 0.5">
随机数大于0.5
</div>
<div v-else>
随机数小于于0.5
</div>
注意:v-else 指令必须配合
v-if 指令一起使用,否则它将不会被识别!
1.5.3 v-else-if
v-else-if 指令,顾名思义,充当 v-if 的“else-if 块”,可以连续使用:
<div v-if="type === 'A'">优秀</div>
<div v-else-if="type === 'B'">良好</div>
<div v-else-if="type === 'C'">一般</div>
<div v-else>差</div>
注意:v-else-if 指令必须配合
v-if 指令一起使用,否则它将不会被识别!
1.6 列表渲染指令
vue 提供了v-for
列表渲染指令,用来辅助开发者基于一个数组来循环渲染一个列表结构。v-for 指令需要使
用 item in items
形式的特殊语法,其中:
- items 是
待循环的数组
- item 是
被循环的每一项
data:{
list:[
{id: 1, name: 'zs'},
{id: 2, name: 'ls'}
]
}
//--------------分割--------------
<ul>
<li v-for="item in list">姓名是:{{item.name}}</li>
</ul>
1.6.1 v-for 中的索引
v-for 指令还支持一个可选的第二个参数,即当前项的索引。语法格式为 (item, index) in items
,示例代码如下:
data:{
list:[
{id: 1, name: 'zs'},
{id: 2, name: 'ls'}
]
}
//--------------分割--------------
<ul>
<li v-for="(item, index) in list">索引:{{index}},姓名是:{{item.name}}</li>
</ul>
1.6.2 使用 key 维护列表的状态
当列表的数据变化时,默认情况下,vue 会尽可能的复用已存在的 DOM 元素,从而提升渲染的性能。但这种
默认的性能优化策略,会导致有状态的列表无法被正确更新。
为了给 vue 一个提示,以便它能跟踪每个节点的身份,从而在保证有状态的列表被正确更新的前提下,提升渲
染的性能。此时,需要为每项提供一个唯一的 key 属性:
// 加key属性的好处
//1. 正确维护列表的状态
//2. 服用现有的DOM元素, 提升渲染的性能
<ul>
<li v-for="item in list" :key="item.id">
<input type="checkbox">
姓名:{{item.name}}
</li>
</ul>
1.6.3 key 的注意事项
① key 的值只能是字符串
或数字
类型
② key 的值必须具有唯一性
(即:key 的值不能重复)
③ 建议把数据项 id 属性的值
作为 key 的值(因为 id 属性的值具有唯一性)
④ 使用 index 的值
当作 key 的值没有任何意义
(因为 index 的值不具有唯一性)
⑤ 建议使用 v-for 指令时一定要指定 key 的值
(既提升性能、又防止列表状态紊乱)
2. 过滤器
过滤器(Filters)
是 vue 为开发者提供的功能,常用于文本的格式化
。过滤器可以用在两个地方:插值表达式
和 v-bind 属性绑定
。
过滤器应该被添加在 JavaScript 表达式的尾部
,由“管道符”
进行调用,示例代码如下:
在双花括号中通过“管道符”调用capitalize过滤器,对message的值进行格式化
<p>{{message | capitalize}}</p>
在 v-bind 中通过管道符调用formatId过滤器,对rawId的值进行格式化
<div v-bind:id="rawId | formatId"></div>
注意:
- 要定义到filters节点下,本质是一个函数
- 在过滤器函数中,一定要有return值
- 在过滤器的形参中,就可以获取到“管道符”前面的值
- 如果全局过滤器和私有过滤器名字一致,此时按照“就近原则”,调用的是“私有过滤器”
2.1 定义过滤器
在创建 vue 实例期间,可以在 filters 节点
中定义过滤器,示例代码如下:
const vm = new Vue({
el: "#app",
data: {
message: 'hello vue.js'
},
// 过滤器函数,必须被定义到filters节点下
// 过滤器本质上是函数
filters: {
// 过滤器函数形参中的val,永远是管道符前面的值
capi(val) {
const first = val.charAt(0).toUpperCase()
const other = val.slice(1)
// 过滤器中,一定要有一个返回值
return first + other
}
}
})
2.2 私有过滤器
和全局过滤器
在 filters 节点下定义的过滤器,称为“私有过滤器
”,因为它只能在当前 vm 实例所控制的 el 区域内使用
。
如果希望在多个 vue 实例之间共享过滤器
,则可以按照如下的格式定义全局过滤器
:
// 全局过滤器 - 独立于每个vm实例之外
// Vue.filter()方法接收两个参数
// 第一个参数,是全局过滤器的名字
// 第二个参数,是全局过滤器的“处理函数”
Vue.filter('capi', function(str){
const first = str.charAt(0).toUpperCase()
const other = str.slice(1)
return first + other + '~~'
})
2.3 连续调用多个过滤器
过滤器可以串联地
进行调用,例如:
<!-- 把message 的值,交给filterA 进行处理 -->
<!-- 把filterB 处理的结果,再交给filterB 进行处理 -->
<!-- 最终把 filterB 处理的结果,作为最终的值渲染到页面上 -->
<p>{{ message | filterA | filterB }}</p>
示例代码如下:
<!-- 串联调用多个过滤器 -->
<p>{{ text | capitalize| maxLength }}</p>
// 全局过滤器-首字母大写
Vue.filter('capitalize', (str) => {
return str.charAt(0).toUpperCase()+str.slice(1) + '~~'
})
// 全局过滤器 - 控制文本的最大长度
Vue.filter('maxLength ', (str) => {
if (str.length <=10)
return str
return str.slice(0, 11)
})
2.4 过滤器传参
过滤器的本质
是 JavaScript 函数
,因此可以接收参数,格式如下:
<!-- arg1 和 arg2 是传递给filterA的参数 -->
<p>{{ message | filterA(arg1, arg2) }}</p>
// 过滤器处理函数的形参列表中:
// 第一个参数:永远都是“管道符”前面待处理的值
// 从第二个参数开始,才是调用过滤器时传递过来的 arg1 和arg2参数
Vue.filter('filterA', (msg, arg1, arg2) => {
})
示例代码如下:
<!-- 调用 maxLength 过滤器传参 -->
<p>{{ text | capitalize| maxLength(5) }}</p>
// 全局过滤器-首字母大写
Vue.filter('capitalize', (str) => {
return str.charAt(0).toUpperCase()+str.slice(1) + '~~'
})
// 全局过滤器 - 控制文本的最大长度
Vue.filter('maxLength ', (str, len = 10) => {
if (str.length <= len)
return str
return str.slice(0, len)
})
2.5 过滤器的兼容性
过滤器仅在 vue 2.x 和 1.x 中受支持,在vue 3.x
的版本中剔除了过滤器
相关的功能。
在企业级项目开发中:
- 如果使用的是 2.x 版本的 vue,则依然可以使用过滤器相关的功能
- 如果项目已经升级到了 3.x 版本的 vue,官方建议使用
计算属性
或方法
代替被剔除的过滤器功能
具体的迁移指南,请参考 vue 3.x 的官方文档给出的说明:
https://v3.vuejs.org/guide/migration/filters.html#migration-strategy
品牌列表案例
略…
总结
① 能够知道 vue 的基本使用步骤
- 导入 vue.js 文件
- new Vue() 构造函数,得到 vm 实例对象
- 声明 el 和 data 数据节点
- MVVM 的对应关系
② 掌握 vue 中常见指令
的基本用法
- 插值表达式、v-bind、v-on、v-if 和 v-else
- v-for 和 :key、v-model
③ 掌握 vue 中过滤器
的基本用法
- 全局过滤器 Vue.filter(‘过滤器名称’, function)
- 私有过滤器 filters 节点