Vue.js 阅读笔记(二)
系统、框架性的认识
Vue。v-bind、v-on、v-if、v-for、v-model。
内置指令
基本指令
v-cloak
v-cloak不需要表达式,它会在实例结束编译时从绑定的HTML元素上移除,经常和CSS中的display: none;配合使用。
1 | <div id="app" v-cloak> |
1 | [v-cloak] { |
当网速较慢,vue.js 文件还没有加载完时,页面上就会显示 的字样,直到 Vue 创建实例、编译模板时, DOM 才会被替换,所以这个过程中,屏幕是会有闪动的,使用 v-cloak 配合 CSS,就是解决初始化慢导致页面抖动的最佳实践。
一般情况下,在使用了 webpack 和 vue-route 时,项目的 HTML 只有一个空的 div 元素,剩余的内容都是由路由去挂载不同组件完成的,所以也就不需要 v-cloak 了。
v-once
也是一个不需要表达式的指令,作用是定义它的组件或元素只被渲染一次,包括元素或组件的所有节点。首次渲染之后,不再随数据的变化重新渲染,将被视为静态内容。
1 | <div id="app" v-once> |
v-once 在业务中很少使用,当需要进一步优化性能时,才可能会使用到。
条件渲染指令
v-if、v-else-if、v-else
与
JavaScript的条件语句if、else、else if类似,Vue.js的条件指令可以根据表达式的值在DOM中渲染或销毁元素/组件。
1 | <div id="app"> |
Vue 在渲染元素时,会尽可能的复用已有的元素而非重新渲染:
1 | <div id="app"> |
这里键入内容,点击切换后,虽然 DOM 改变了,但是输入框的内容并没有改变,只是替换了 placeholder 的内容,<input> 元素被复用了。
如果你不希望这样,可以使用 key 属性,它可以决定是否要复用元素,key 值必须要是唯一的。
1 | <div id="app"> |
v-show
v-show与v-if基本一致,只不过v-show是改变元素的CSS属性display,当表达式的值为false时,元素会隐藏。
1 | <div id="app"> |
1 | <div id="app"> |
注意:v-show 不能在 <template> 上使用。
v-if和v-show的选择
v-if 是条件渲染,会根据表达式适当的销毁或重建元素及绑定事件或子组件。若表达式一开始为 false,则一开始元素\组件并不会被渲染,只有当条件第一次变为 true 时才开始编译。
v-show 只是简单的 CSS 属性切换,无论条件是否为 true,都会被编译。
相比之下,v-if 更适合条件不经常改变的场景,因为它切换的开销相对较大,而 v-show 适合用于频繁切换的条件。
列表渲染指令
v-for
当需要将一个数组遍历或枚举一个对象循环显示时,就需要用到列表渲染指令
v-for。
1 | <div id="app"> |
除了用 in 做分隔符,也可以使用 of 作为分隔符:
1 | <li v-for="book of books">{{ book.name }}</li> |
还支持一个可选参数作为当前索引:
1 | <li v-for="(book, index) in books">{{ index }} - {{ book.name }}</li> |
可选参数放在后面
除了数组外,对象的属性也是可以遍历的。
1 | <div id="app"> |
遍历对象属性时,有两个可选参数,分别是键名和索引,参数传入顺序为 (value, key, index)。
- 数组更新
Vue的核心是数据与视图的双向绑定,当我们修改数组时,Vue会检测到数据的变化,所以渲染的视图也会立即更新。
数组方法:
push()- 向数组的末尾添加一个或多个元素,并返回新的长度。
pop()- 用于删除并返回数组的最后一个元素。
shift()- 用于把数组的第一个元素从其中删除,并返回第一个元素的值。
unshift()- 向数组的开头添加一个或更多元素,并返回新的长度。
splice()- 从数组中添加/删除项目,然后返回被删除的项目。
sort()- 对数组的元素进行排序。
reverse()- 用于颠倒数组中元素的顺序。
还有一些方法不会改变原数组:
filter()- 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
concat()- 用于连接两个或多个数组。
slice()- 从已有的数组中返回选定的元素(切片)。
1 | <div id="app"> |
这样,第二项 Asuka 就会被过滤。
Vue 在检测到数据变化时,并不是直接渲染整个列表,而是最大化的复用了 DOM 元素,替换的数组中,含有相同的元素的项不会被重新渲染,因此可以大胆的用新数组来替换旧数组,不用担心性能问题。
- 过滤与排序
当不想改变原数组,想通过一个数组副本来做过滤或者排序显示时,可以使用计算属性来返回过滤或排序后的数组。
1 | <div id="app"> |
方法与事件
Vue中事件处理引入了v-on。
一个计时器的例子:
1 | <div id="app"> |
在 methods 中我们定义了需要的方法供 @click 调用,需要注意的是,调用的方法名后可以不跟括号 ()。此时,如果该方法有参数,默认就会将原生事件对象 event 传入。
在大部分业务场景中,如果方法不需要传入参数,为了简便可以不写括号。
Vue 还提供了一个特殊的变量 $event,用于访问原生 DOM 事件:
1 | <div id="app"> |
- 修饰符
在上一例中使用的 event.preventDefault() 也可以用 Vue 事件的修饰符来实现。
.stop.prevent.capture.self.once
具体用法:
1 | <!-- 阻止单击事件冒泡 --> |
1 | <!-- 提交事件不再重载页面 --> |
修饰符也可以串联:
1 | <a @click.stop.prevent="handle"></a> |
只有修饰符:
1 | <form @sublit.prevent></form> |
1 | <!-- 添加事件侦听器时使用事件捕获模式 --> |
1 | <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 --> |
1 | <!-- 只触发一次,组件同样适用 --> |
键盘监听事件:
1 | <input @keyup.13="submit"> |
除了具体的某个 keyCode 外, Vue 还提供了一些快捷键名称:
.enter.tabdelete(捕获 删除 和 退格键)escspaceupdownleftright
按键可以组合使用,或配合鼠标使用:
.ctrlaltshiftmeta(Mac上是Command键,Windows上是窗口键 )
1 | <!-- shift + s --> |
v-model
表单类控件承载了一个网页的录入与交互,
Vue中使用v-model完成表单的数据双向绑定。
- 基本用法
1 | <div id="app"> |
对于文本域(textarea)也是同样的用法。
可以用 @input 代替 v-model,事实上,v-model 也是一个特殊的语法糖,只不过它会在不同的表单上智能处理。
1 | <div id="app"> |
单选按钮:
单选按钮在单独使用时,不需要
v-model,直接使用v-bind绑定一个布尔类型的值,为真时为选中。
1 | <div id="app"> |
配合 v-model 和 value 组合实现互斥效果:
1 | <div id="app"> |
复选框:
复选框单独使用时,使用
v-model绑定一个布尔值。
1 | <div id="app"> |
多个复选框(以数组绑定值):
1 | <div id="app"> |
选择列表:
下拉选择器,也分为单选和多选两种方式。
1 | <div id="app"> |
在业务中,<option> 经常用 v-for 动态输出,value 和 text 也是用 v-bind 来动态输出:
1 | <div id="app"> |
虽然用选择列表 <select> 控件可以简单的完成下拉选择的需求,但是在实际业务中反而不常用,
因为它的样式依赖平台和浏览器,无法统一,也不太美观,功能也受限,比如不支持搜索,
所以常见的解决方案是使用 <div> 模拟一个类似的控件。
- 绑定值
在业务中,往往需要绑定一个动态数据,这时可以使用
v-band来实现。
单选按钮:
1 | <div id="app"> |
在选中时,app.picked === app.value,值都是 123。
复选框:
1 | <div id="app"> |
勾选时,app.toggle === app.value1;未勾选时,app.toggle === app.value2。
选择列表:
1 | <div id="app"> |
当选中时,app.selected 是一个 Object,app.selected.number === 456
- 修饰符
与事件的修饰符类似,
v-model也有修饰符,用于控制数据同步的时机。
.lazy:
在输入框中,v-model 默认是在 input 事件中同步输入框的数据,使用修饰符 .lazy 会转变为在 change 事件中同步。
1 | <div id="app"> |
这时,message 并不是实时改变的,而是在失去焦点或按回车时才更新。
.number:
使用修饰符 .number 可以将输入转换为 Number 类型,否则虽然输入的是数字,但它的类型其实是 String,在数字输入框中会比较有用。
1 | <div id="app"> |
.trim:
修饰符 .trim 可以自动过滤输入的首尾空格。
1 | <div id="app"> |