vue学习总结(二)-指令详解
指令是带有特殊前缀"v-"的HTML特性,它绑定一个表达式,并将一些特性用在DOM上。
内置指令
v-bind
v-bind主要用法是动态更新HTML元素上的属性。常见的比如class及style。
绑定class的方式
- v-bind:class设置一个对象,可以动态切换class.如:
...
<div :class="{'active' : isActive}"></div>
<script>
var app = new Vue({
el : "#app",
data : {
isActive : true
}
})
</script>
当条件过长或者逻辑复杂可以绑定在计算属性上。
- 数组语法
<div :class="[activeCls, errorCls]"></div>
<script>
var app = new Vue({
el : "#app",
data : {
activeCls : "active",
errorCls : "error"
}
})
数组中可使用三元表达式切换class,也可在其中使用对象语法。
绑定内联样式v-bind:style,与class类似,也有对象语法和数组语法,
在组件上写class :class或者style :style时,规则会直接应用到这个组件的根元素上。
v-cloak
v-cloak不需要表达式,会在Vue实例结束编译时从绑定的HTML元素上移除,通常和css display:none配合使用。在网速较慢,Vue.js文件未加载玩是,页面可能会出现{{message}}的字样,直接Vue创建实例编译模板,DOM才会替换,屏幕在这个过程会有闪动。
v-cloak是一个解决初始化慢导致页面闪动的最佳实践,对于简单项目有用,但对于复杂项目,例如结合webpack使用时,html结构只有一个空div元素,内容由挂载不同组件完成,故不需要使用。
v-once
不需要表达式,定义它的元素或组件只渲染一次,包括元素或组件的所有子节点,首次渲染后不在随数据的变化重新渲染,将被视为静态内容。
v-if、v-else-if、v-else
v-else-if要紧跟v-if,v-else要紧跟v-else-if或v-if,表达式为真时当前元素/组件及子节点将被渲染,为假时移除。如果一次判断多个元素可以在Vue内置元素上使用条件指令,最终渲染时不包括改元素。 这里input不会在复用,切换时输入内容也会删除,但label还是会被复用。 v-show是改变元素css属性display,当切换频繁时使用,但不能用在v-template上。 2.如果在webpack中使用组件化方式 这里this指向当前组件实例,即app。在非webpack模式下也可以用$set方法。比如app.$set(...).也可使用splice。 写法与组件类似,只是方法名由component改为directive。 自定义指令的选项是由几个钩子函数组成的,每个都是可选的。
Vue在渲染元素时,处于效率考虑,会尽可能复用已有的元素而非重新渲染。比如Input元素,使用v-if v-else时,DOM虽然在切换时变了,但是之前输入框的内容并不会变,只会替换placeholder的内容。可以使用Vue提供的key属性,它可以决定是否要复用元素,key的值必须唯一。
...
<template v-if="type === 'name'">
<label>用户名:</label>
<input placeholder="输入用户名" key="name-input"/>
</template>
<template v-else>
<label>邮箱:</label>
<input placeholder="输入邮箱" key="mail-input"/>
</template>
v-show
v-for
v-for="book in books"。列表渲染也支持使用of替代in。
v-for="(book, index) in books",第二项就是books当前项的索引。v-for="value in user"。遍历对象有两个可选参数,分别是键名和索引v-for="(value, key, index) in user"v-for="n in 10"
v-for也可用在内置标签上,对于将多个元素进行渲染。
Vue的核心是数据与视图的双向绑定,当我们修改数组时,Vue会检测到数据变化,所以用v-for渲染的视图也会立即更新。使用这些方法改变数组会触发视图更新:push、pop、shift、unshift、splice、sort、reverse。在使用fiter、concat、slice、map等时不会替换原数组。
注意:slice返回一个新数组,不过是浅拷贝。
Vue在检测到数组变化时,并不是直接重新渲染整个列表,而是最大化的复用DOM元素,替换的数组中,含有相同元素的项不会被重新渲染。但是Vue不能检测到通过索引直接设置项和修改数组长度引起的数组变化,即不会触发视图更新。
app.books[3] = {...} app.books.length = 1
如果必须要这样使用可以这样解决,对于直接设置项
Vue.set(app.books, 3 , {
name : "RORONOA"
...
})
this.$set(app.books, 3 ,{
name: "CHOPPER"
...
})
v-model
自定义指令
注册方法
var app = new Vue({
el : "#app",
directives : {
focus : {
//指令选项
}
}
})
自定义指令选项
bind : 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
inserted : 被绑定元素插入父节点时调用(父节点存在时即可调用,不必存在于document中)。
update : 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。
componentUpdated : 被绑定元素所在模板完成一次更新周期时调用。
unbind : 只调用一次,指令与元素解绑时调用。
每个钩子函数都有几个参数可用,
el : 指令所绑定的元素,可以用来直接操作DOM
binding : 一个对象
vnode : Vue编译生成的虚拟节点
oldVnode : 上一个虚拟节点,仅在update和componentUpdate钩子中可用
大多数使用场景,会在bind钩子里绑定一些事件,比如document上用addEventListener绑定,在unbind里用removeEventListener解绑。binding属性

浙公网安备 33010602011771号