vue2的watch详解。真的是服了这个watch有bug
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
在 Vue.js 2 中,watch
是一个用来观察和响应 Vue 实例数据变动的选项。它可以用来监听数据的变化并执行相应的逻辑,比如在数据变化时更新界面或者执行一些异步操作。
基本用法
监听单个数据源
最简单的用法是监听单个数据源(即一个数据属性)的变化:
new Vue({
data: {
message: 'Hello, Vue.js!'
},
watch: {
message: function(newVal, oldVal) {
console.log(`message 从 ${oldVal} 变为 ${newVal}`);
}
}
});
监听多个数据源
你也可以同时监听多个数据源,将 watch
中的键值对扩展为多个属性:
new Vue({
data: {
firstName: 'John',
lastName: 'Doe',
fullName: 'John Doe'
},
watch: {
firstName: function(newVal, oldVal) {
this.fullName = newVal + ' ' + this.lastName;
},
lastName: function(newVal, oldVal) {
this.fullName = this.firstName + ' ' + newVal;
}
}
});
这时候打印的newval和oldval是不一样的。因为他是单个数据源。当我们监听对象里面的属性时就发现了不同了。
高级用法
深度监听对象或数组的变化
当需要监听对象或数组内部属性的变化时,可以设置 deep: true
new Vue({
data: {
user: {
name: 'John',
age: 30
}
},
watch: {
user: {
handler: function(newVal, oldVal) {
console.log('user 对象发生变化',newVal, oldVal);
},
deep: true
}
}
});
这时候打印的newVal, oldVal其实是一样的,而且必须加上deep:true。要不然即使对象里面属性改变handler函数也是不执行的。可以去掉试试。
使用 deep: true
可以深度遍历对象内部的属性,当任意属性发生变化时都会触发 watch
的处理函数。
娜娜娜娜,我们yao监听对象里的属性怎么办,只想其中的属性改变时执行某个方法怎么办,
see👇
监听对象里的属性
new Vue({
data: {
user: {
name: 'John',
age: 30,
type: 30,
}
},
watch: {
'user.type': {
handler(newVal, oldVal) {
// 打印旧值和新值
console.log('旧值:', oldVal, '新值:', newVal);
// 执行相关操作
if (newVal !== oldVal) {
// this.updateStyle();
this.addMapServer(newVal);
}
},
immediate: true // 立即执行一次监听函数
}
}
});
立即触发监听函数
可以通过设置 immediate: true
来立即触发监听函数,即在初始化时立即执行一次监听函数:
new Vue({
data: {
count: 0
},
watch: {
count: {
handler: function(newVal, oldVal) {
console.log(`count 的值变为 ${newVal}`);
},
immediate: true
}
}
});
如果要监听对象里面多个属性变化
你可以使用计算属性来派生新的数据,然后通过 watch
特性来监听这个计算属性的变化。
computed: {
comSetView() {
return `${this.option.lng},${this.option.lat},${this.option.height},${this.option.pitchRadiu}`;
}
}
watch: {
comSetView: {
deep: true,
handler(){
this.metSetView()
}
},
}
这样就不用一个一个属性的拆开写了
移除监听
如果需要在组件销毁时移除 watch
,可以通过 vm.$watch
返回的函数来移除监听:
var unwatch = vm.$watch('expression', callback);
// 在适当的时机移除监听
unwatch();
GitHub 加速计划 / vu / vue
80
16
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:4 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 6 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 6 个月前
更多推荐
已为社区贡献14条内容
所有评论(0)