vue第四节
模板语法
在vue中,我们使用mustache插值({{}})来将数据渲染在模板中
使用v-once指令可以控制只能插入一次值,当数据变化的时候,模板对应的视图不更新
使用v-html指令可以解析html格式的数据
在html标签属性里不能使用mustache插值,这个时候给元素添加动态属性的时候使用v-bind来绑定属性,可以缩写成:
在使用v-bind绑定class和内联样式的时候,vue做了一些优化,可以使用对象语法和数组的语法来控制
防止表达式闪烁:
- v-cloak
给模板内的元素添加v-cloak属性后,元素在vue没有加载完的时候就有这个属性,当vue加载完成后这个属性就消失了,所以我们可以给这个属性设置css样式为隐藏
<style>
[v-cloak]{
visibility: hidden;
}
</style>
- v-text/v-html
v-text会指定将模板内元素的textContent属性替换为指令值所代表的数据
v-html可以解析标签,更改元素的innerHTML,性能比v-text较差 - v-pre
跳过元素和其子元素的编译过程,可以用来显示mustache
vue-resource
这是一款vue的插件,可以用来进行数据交互,支持的请求方式:GET/POST/JSONP/...
这个插件官方宣布不在更新维护,也就是说尽量不要使用
计算属性、监听
有的时候我们需要在模板中使用数据a,这个时候就需要用到表达式,但是有的地方我们需要对a数据进行一些简单的处理后才能使用,那么我们就会在表达式中写一些js逻辑运算
<div id="example">
{{ message.split('').reverse().join('') }}
</div>
这样我们的维护就会非常困难,也不便于阅读
那我们就可以在methods里设置一个方法,在模板的表达式中使用这个方法
<p>Reversed message: "{{ reversedMessage() }}"</p>
// 在组件中
methods: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
}
但是这个时候,只要vm中有数据变化,这个变化的数据可能和我们关注的数据无关,但是vm都会重新渲染模板,这个时候表达式中的方法就会重新执行,大大的影响性能
这个时候其实我们可以使用监听器里完成:
在vm实例中设置watch属性,在里面通过键值对来设置一些监听,键名为数据名,值可以是一个函数,这个函数在数据改变之后才会执行,两个参数分别是性格前的值和更改后的值
a: function (val, oldVal) {
console.log('new: %s, old: %s', val, oldVal)
}
值还可以是一个方法名字,当数据改变的时候这个方法会执行
当数据为object的时候,object的键值对改变不会被监听到(数组的push等方法可以),这个时候需要设置深度监听:
c: {
deep:true,
handler:function (val, oldVal) {
console.log('new: %s, old: %s', val, oldVal)
}
},
监听的handler函数前面的这几种写法都是在数据变化的时候才会执行,初始化的时候不会执行,但是如果设置immediate为true就可以了
num:{
immediate:true,
handler:function(val){
this.nums = val*2
}
}
我们在回到上面的问题,用监听器加上immediate属性就可以做到该效果,但是大家可以看到的是逻辑稍稍有点复杂
我们一般都会用到一个叫计算属性的东西来解决:
计算属性就是在实例配置项中通过computed来为vm设置一个新的数据,而这个新数据会拥有一个依赖(一条已经存在的数据),当依赖发送变化的时候,新数据也会发送变化
与方法的方式相比,它性能更高,计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。
与watch相比,写起来简单,逻辑性更清晰,watch一般多用于,根据数据的变化而执行某些动作,至于这些动作是在干什么其实无所谓,而计算属性更有针对性,根据数据变化而更改另一个数据
计算属性也拥有getter和setter,默认写的是getter,设置setter执行可以当此计算属性数据更改的时候去做其他的一些事情,相当于watch这个计算属性
computed:{
xm:function(){
return ...
}
}
computed:{
xm:{
get:function(){//getter 当依赖改变后设置值的时候
return this.xing+'丶'+this.ming
},
set:function(val){//setter 当自身改变后执行
this.xing = val.split('丶')[0]
this.ming = val.split('丶')[1]
}
}
}
条件渲染
在Vue中可以使用v-if来控制模板里元素的显示和隐藏,值为true就显示,为false就隐藏
v-if控制的是是否渲染这个节点
当我们需要控制一组元素显示隐藏的时候,可以用template标签将其包裹,将指令设置在template上,等等vm渲染这一组元素的时候,不会渲染template
当有else分支逻辑的时候,可以给该元素加上v-else指令来控制,v-else会根据上面的那个v-if来控制,效果与v-if相反,注意,一定要紧挨着
还有v-else-if指令可以实现多分支逻辑
<input type="text" v-model="mode">
<template v-if="mode=='A'">
<h1>1.title</h1>
<p>我的第一个P标签</p>
</template>
<template v-else-if="mode=='B'">
<h1>2.title</h1>
<p>我的第二个P标签</p>
</template>
<template v-else-if="mode=='C'">
<h1>3.title</h1>
<p>我的第三个P标签</p>
</template>
<template v-else>
<p>不好意思,输入有误</p>
</template>
需要注意的另一个地方是:Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这样确实能使Vue变得更快,性能更高,但是有的时候我们需要让实例去更新dom而不是复用,就需要给dom加上不同的key属性,因为vue在判断到底渲染什么的时候,包括哪些dom可以复用,都会参考key值,如果dom表现基本一致,符合复用的条件,但是key值不同,依然不会复用
Vue还提供了v-show指令,用法和v-if基本一样,控制的是元素的css中display属性,从而控制元素的显示和隐藏 , 不能和v-else配合使用,且不能使用在template标签上,因为template不会渲染,再更改它的css属性也不会渲染,不会生效
v-if vs v-show
v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。
一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。
mixin
在Vue中,我们可以通过定义多个mixin来实现代码抽离复用,便于维护,提升页面的逻辑性
要注意的是:data属性不要使用mixin,因为从逻辑上来说,每一个实例、组件的数据都应该是独立的
一个mixin其实就是一个纯粹的对象,上面挂载着抽离出来的配置,在某一个实例中,通过mixins选项(数组)导入后,此实例就拥有导入的mixin的配置
且导入的配置不会覆盖原有的,而是合并到一起