1. 概述
watch 是一个对象,键是需要观察的表达式,用于观察 Vue 实例上的一个表达式或者一个函数计算结果的变化。回调函数的参数是新值和旧值。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个 property。
2. 常规用法
watch 监听有两个形参,第一个是新值,第二个是旧值。如下例子:使用 watch 监听了 total 的值,当 total 的值改变时,控制台会打印出旧值和新值。
javascript
<template>
<div class="home_box">
<h1>{{ total }}</h1>
<button @click="handleAddTotal">增加</button>
</div>
</template>
<script>
export default {
name: 'Home',
watch: {
total(newValue, oldValue) {
console.log('旧值:', oldValue)
console.log('新值:', newValue)
}
},
data() {
return {
total: 0
}
},
methods: {
handleAddTotal() {
this.total++
}
}
}
</script>
3. 监听对象和route变化
watch监听的目标,可以是基本类型,也可以是对象,也可以是对象里的一个值。而监听目标的属性,可以是一个函数,也可以是一个包含handler(回调函数),immediate(是否初始化后立即执行一次)和deep(是否开启深度监听)的对象。
javascript
<script>
export default {
name: 'Home',
watch: {
// 监听基本类型
aaa(newValue, oldValue) {
console.log('旧值:', oldValue)
console.log('新值:', newValue)
},
// 监听基本类型,并且回调函数写在methods里,且初始化加载立即执行一次
bbb: {
handler: 'handleBBB',
immediate: true
},
// 监听对象类型,需要开启深度监听
ccc: {
handler: (newValue, oldValue) {
console.log('旧值:', oldValue)
console.log('新值:', newValue)
},
deep: true
},
// 监听对象里的某个值
'ddd.d2.d21': {
handler: (newValue, oldValue) {
console.log('旧值:', oldValue)
console.log('新值:', newValue)
}
},
// 监听route变化
'$route': {
handler: (newValue, oldValue) {
console.log('旧值:', oldValue)
console.log('新值:', newValue)
}
}
},
data() {
return {
aaa: 0,
bbb: 0,
ccc: {
c1: 0,
c2: 0
},
ddd: {
d1: 0,
d2: {
d21: 0
}
}
}
},
methods: {
handleBBB() {
this.bbb++
}
}
}
</script>
4. 使用场景
watch监听属性使用场景很多。比如:
- 即时表单验证
- 搜索
- 监听数据变化,做出相应改变
- ......
如下例子,监听 keyword 的值,实时打印出来。
javascript
<template>
<div class="home_box">
<input type="text" v-model="keyword">
</div>
</template>
<script>
export default {
name: 'Home',
watch: {
keyword: {
handler: 'handleKeywordChange'
}
},
data() {
return {
keyword: '',
}
},
methods: {
handleKeywordChange(newValue, oldValue) {
console.log(newValue, oldValue)
}
}
}
</script>
本次分享就到这儿啦,我是鹏多多,如果看了觉得有帮助的,欢迎 点赞 关注 评论,在此谢过道友;
往期文章
- 前端图片裁剪Cropper.js核心功能与实战技巧详解
- 前端使用CountUp.js制作数字动画效果的教程
- React状态管理库Zustand的实用教程
- 开发个人微信小程序类目选择/盈利方式/成本控制与服务器接入指南
- 编辑器也有邪修?盘点VS Code邪门/有趣的扩展
- flutter-使用AnimatedDefaultTextStyle实现文本动画
- js使用IntersectionObserver实现目标元素可见度的交互
- Web前端页面开发阿拉伯语种适配指南
- 让网页拥有App体验?PWA 将网页变为桌面应用的保姆级教程PWA
- 助你上手Vue3全家桶之Vue3教程
- 使用nvm管理node.js版本以及更换npm淘宝镜像源
- 超详细!Vue的十种通信方式
- 手把手教你搭建规范的团队vue项目,包含commitlint,eslint,prettier,husky,commitizen等等