一、 在Vue中有多种方法为视图设置值:
- 使用指令直接将数据值绑定到视图
- 使用简单的表达式对内容进行简单的转换
- 使用过滤器对内容进行简单的转换
- 我们还可以使用
计算属性
根据数据模型中的值或一组值来计算显示值。
计算属性允许我们对指定的视图,复杂的值计算。这些值将绑定到依赖项值,只在需要时更新。
一、 watch是什么?
watch主要用于监控vue实例的变化
,它监控的变量当然必须在data里面声明
才可以,它可以监控一个变量
,也可以是一个对象
。
二、 computed是什么?
computed用来监控自己定义的变量
,该变量不在data
里面声明,直接在computed里面定义,然后就可以在页面上进行双向数据绑定
展示出结果或者用作其他处理;
computed比较适合对多个变量
或者对象
进行处理后返回一个结果值
,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化,
举例:总金额=价格*数量
当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理。
所以,对于任何复杂逻辑,你都应当使用计算属性。
基础用法:
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
使用computed计算属性传参:
<p v-for="(item, index) in 4" :key="index">
<span>初始值:{{item}},</span>
<span>{{item}}*2 = {{caculate(item)}}</span>
</p>
computed: {
// 将每个传进来的值乘以2
caculate () { //此处不需要携带参数
return function (val) {
return val*2
}
},
}
注:在组件内为computed属性赋值
的时候,如果没有显示的声明setter,会遇到Computed property ‘XX‘ was assigned to but it has no setter
,根据控制台错误提示,组件中定义的computed属性缺少setter,需要设置get()
和set()
方法,解决办法如下:
computed: {
setting: {
get() {
return this.xx
},
set(val) {
this.xx = val;
}
},
}
二、 watch的3种用法
在vue中,使用watch来响应数据的变化。watch的用法大致有三种。下面代码是watch的一种简单的用法:
第一种:
直接写一个监听处理函数
,当每次监听到 cityName 值发生改变
时,执行函数
。
new Vue({
el: '#root',
data: {
cityName: 'shanghai',
name: ''
},
watch: {
cityName(newName, oldName) {
this.name = newName
}
}
})
也可以在所监听的数据后面直接加字符串
形式的方法名
:
new Vue({
el: '#root',
data: {
cityName: 'shanghai',
name: ''
},
watch: {
cityName: 'nameChange'
},
methods() {
nameChange(newName, oldName) {
this.name = newName
}
}
})
第二种: immediate
和handler
当值第一次绑定
的时候,不会执行
监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值
的时候也执行函数,则就需要用到immediate属性。
比如当父组件向子组件动态传值
时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true。
监听的数据后面写成对象形式
,包含handler方法和immediate,
new Vue({
el: '#root',
data: {
cityName: 'shanghai',
name: ''
},
watch: {
cityName: {
handler(newName, oldName) {
this.name = newName
},
immediate: true //子组件props首次获取父组件传值,执行函数
}
}
})
第三种:deep
当需要监听一个对象的改变
时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。
new Vue({
el: '#root',
data: {
cityName: {id: 1, name: 'shanghai'},
name: ''
},
watch: {
cityName: {
handler(newName, oldName) {
this.name = newName.name
},
deep: true, //监听对象
immediate: true
}
}
})
如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:
new Vue({
el: '#root',
data: {
cityName: {id: 1, name: 'shanghai'},
name: ''
},
watch: {
'cityName.name': {
handler(newName, oldName) {
this.name = newName
},
deep: true, //监听对象
immediate: true
}
}
})
数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听。