vue 监听器及计算属性高阶用法
文章目录
- 监听器的高级用法
- 深度监听
- 立即触发
- 计算属性的高级用法
- Getter 和 Setter
- 缓存策略
- 计算属性的依赖
- 总结
监听器的高级用法
深度监听
默认情况下,Vue.js 的监听器只会监听对象或数组的第一层属性变化,而不会深度监听其嵌套的属性变化。但是,在某些情况下,我们需要深度监听对象或数组中的所有属性变化。这时,我们可以使用deep选项来设置深度监听。
例如,假设我们有以下数据:
data: {
user: {
name: 'John',
age: 30,
address: {
city: 'New York',
state: 'NY'
}
}
}
如果我们需要深度监听user对象中的所有属性,包括其嵌套的属性,可以使用以下代码:
watch: {
'user': {
handler: function (val, oldVal) { /* ... */ },
deep: true
}
}
这样,当user对象中任何一个属性发生变化时,都会触发监听器。
立即触发
默认情况下,Vue.js 的监听器是在被监听的属性发生变化后才会触发。但是,在某些情况下,我们需要在监听器创建时立即触发一次监听器函数(handler)。这时,我们可以使用immediate选项来设置立即触发监听器。
例如,假设我们有以下数据:
data: {
counter: 0
}
如果我们需要在监听器创建时就立即触发一次监听器函数,可以使用以下代码:
watch: {
'counter': {
handler: function (val, oldVal) { /* ... */ },
immediate: true
}
}
这样,当监听器创建完成后,就会立即触发一次监听器函数。
计算属性的高级用法
Getter 和 Setter
默认情况下,计算属性只有 getter 函数,它用于计算出一个新的值。但是,在某些情况下,我们也需要一个 setter 函数,用于更新计算属性所依赖的原始数据。这时,我们可以使用get和set选项来设置 getter 和 setter 函数。
例如,假设我们有以下数据:
data: {
firstName: 'John',
lastName: 'Doe'
}
如果我们需要定义一个计算属性fullName,它的值为firstName和lastName的组合,并且我们希望可以通过fullName来更新firstName和lastName,可以使用以下代码:
computed: {
fullName: {
get: function () {
return this.firstName + ' ' + this.lastName
},
set: function (newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
这样,我们就可以通过fullName计算出一个新的值,并且也可以通过设置fullName来更新原始数据。
缓存策略
默认情况下,Vue.js 的计算属性是具有缓存策略的。这意味着,只有当计算属性依赖的原始数据发生变化时,才会重新计算该属性的值。但是,在某些情况下,我们需要禁用缓存策略,保证每次访问计算属性时都重新计算该属性的值。这时,我们可以使用cache选项来设置缓存策略。
例如,假设我们有以下数据:
data: {
counter: 0
}
如果我们需要定义一个计算属性timestamp,它的值为当前时间戳,并且我们希望每次访问timestamp都重新计算该属性的值,可以使用以下代码:
computed: {
timestamp: {
get: function () {
return Date.now()
},
cache: false
}
}
这样,每次访问timestamp时,都会重新计算该属性的值。
计算属性的依赖
默认情况下,计算属性会自动追踪其所依赖的原始数据,并在其所依赖的原始数据发生变化时重新计算属性的值。但是,在某些情况下,我们需要手动指定计算属性所依赖的原始数据。这时,我们可以使用watch选项来监听原始数据的变化,并在变化时手动更新计算属性的值。
例如,假设我们有以下数据:
data: {
firstName: 'John',
lastName: 'Doe'
}
如果我们需要定义一个计算属性fullName,它的值为firstName和lastName的组合,并且我们希望在firstName或lastName发生变化时手动更新fullName的值,可以使用以下代码:
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
},
watch: {
firstName: function () {
this.fullName = this.firstName + ' ' + this.lastName
},
lastName: function () {
this.fullName = this.firstName + ' ' + this.lastName
}
}
这样,每当firstName或lastName发生变化时,就会手动更新fullName的值。
总结
监听器和计算属性是Vue.js中非常重要的特性,它们可以让我们更加方便地监控和处理数据的变化。在本文中,我们探讨了监听器和计算属性的高级用法,包括深度监听、立即触发、Getter 和 Setter、缓存策略以及计算属性的依赖等。通过深入理解这些高级用法,我们可以更好地利用Vue.js提供的数据驱动功能,编写出更加灵活和高效的前端代码。