技术经验解读:关于watch的常见用法

简介: 技术经验解读:关于watch的常见用法

首先来看一下vue官方给出的文档描述


一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个 property。


类型: { 【key: string】: string | Function | Object | Array }


简单来说 watch可以监听一个数据的改变,并且改变后让vue做点什么


1.最基础的用法:


  有一个vue的组件,data里面有个name=张三,有个按钮绑定了changeName方法让name发生改变


data() {


return {


name: "张三"


}


},


methods: {


  changeName() {


   this.name = "李四"


}


}


  然后来监听name这个数据//代码效果参考:http://www.lyjsj.net.cn/wx/art_22758.html

,

watch: {


name(newVal, oldVal) {


console.log(我改名了,我之前叫${oldVal},现在叫${newVal})


}


}


  当我们点击这个按钮的时候,会发现控制台输出了"我改名了,我之前叫张三,现在叫李四"


  可以发现监听对象触发的函数有两个形参,第一个形参是改变后的数据,而第二个形参是改变前的数据


  这个时候我们把数据改造一下,实际工作中我们可能用到的数据是很复杂的.例如嵌套了好几层


data() {


return {


info: {


name: "张三"


}


}


},


methods: {


changeName() {


this.info.name= "李四"


}


},


watch: {


info(newVal, oldVal){


console.log("我发生了改变")


}


}


  这个时候发现,控制台上并没有任何的打印.这个是因为一般的监听是监听不到该数据下属性值的变化的.


  于是vue也给我们提供了深度监听的方法.


2.进阶用法


  深度监听只用添加一个属性: deep = true即可


watch: {


info: {


handler(newVal, oldVal) {


console.log("我发生了改变", newVal, oldVal)


}


deep: true


}


}


  加入了新属性之后,监听的数据对应的值不再是一个函数了,而是一个对象,原先的函数对应的是对象下面的handler的属性值,监听数组的话遵循vue的监听数组方法,这里不做多余的介绍


以上可知,watch能监听到数据的改变,并且触发对应的函数,那如果现在有一个新的需求, 就是我在组件初始化的时候就需要知道这个人的姓名怎么办的?


  有人会说,那可以在created函数里面打印就可以了,但是这么做的话会造成代码的重复,如果是相同的功能的话就没有必要再去写一份重复的代码,vue也给我们提供了一个属性,那就是immediate,跟deep的用法一样,也是直接添加属性和属性值即可


watch: {


info: {


handler(newVal, oldVal) {


console.log("我发生了改变", newVal, oldVal)


}


deep: true,


immediate: true


}


}


  这样的话当你的组件初始化的时候,其实是监听器第一次绑定监听数据的时候,handler的这个函数就可以直接触发了,不需要借用created函数了,而且触发的时机是在created函数之前的.


3.注意事项


  1.监听所触发的函数不能用箭头函数,使用箭头函//代码效果参考:http://www.lyjsj.net.cn/wz/art_22756.html

数的时候,this指向的就不是当前的vue实例了

4.拓展


  1.与computed之间的区别


  我们知道vue实例下还提供了一个computed的对象,学名计算属性.也是可以通过数据的改变来进行某些操作.下面就简单来总结一下他们之间的区别,有时面试的时候也会问到


    (1) 功能方面,两者都可以通过数据的改变来进行某些操作.但是watch只能对某一个数据进行监听,而computed的只要函数内部涉及到的变量发生改变,就都会重新进行计算.当然有利也有弊,当需要在数据变化时执行异步或开销较大的操作时,watch方式是最有用的。简单来说就是涉及异步操作然后需要设定不同中间值等,这时候就使用watch。


    (2) 性能方面,由于computed计算有缓存.所以watch性能方面是差于computed的.不过依照上一点.watch适用于执行异步或开销较大的操作

相关文章
|
2月前
|
前端开发 JavaScript 开发者
揭秘JavaScript魔法三剑客:call、apply、bind,解锁函数新世界,你的前端之路因它们而精彩!
【8月更文挑战第23天】在 JavaScript 的世界里,`call`、`apply` 和 `bind` 这三个方法常常让新手感到困惑。它们都能改变函数执行时的上下文(即 `this` 的指向),但各有特点:`call` 接受一系列参数并直接调用函数;`apply` 则接收一个参数数组,在处理不确定数量的参数时特别有用;而 `bind` 不会立即执行函数,而是创建一个新版本的函数,其 `this` 上下文已被永久绑定。理解这三个方法能帮助开发者更好地运用函数式编程技巧,提升代码灵活性和可维护性。
29 0
|
6天前
|
缓存 JavaScript 算法
卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!
该文章深入讲解了Vue3的进阶新特性,包括`watchEffect`的使用、性能优化策略、Vite构建工具的优势以及全局API的变化等内容,帮助开发者更好地掌握Vue3的开发技巧。
卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!
|
2月前
|
前端开发 API 开发者
【React状态管理新思路】Context API入门:从零开始摆脱props钻孔的优雅之道,全面解析与实战案例分享!
【8月更文挑战第31天】React 的 Context API 有效解决了多级组件间状态传递的 "props 钻孔" 问题,使代码更简洁、易维护。本文通过电子商务网站登录状态管理案例,详细介绍了 Context API 的使用方法,包括创建、提供及消费 Context,以及处理多个 Context 的场景,适合各水平开发者学习与应用,提高开发效率和代码质量。
25 0
|
4月前
|
XML 安全 前端开发
必知的技术知识:jinjia2基本用法
必知的技术知识:jinjia2基本用法
98 1
|
4月前
|
Java C#
经验大分享:Task的用法
经验大分享:Task的用法
18 0
|
4月前
|
机器学习/深度学习 安全 Shell
必知的技术知识:find用法详解
必知的技术知识:find用法详解
|
12月前
|
前端开发 JavaScript
带你读《现代Javascript高级教程》二十九、异步的终极解决方案:async/await
带你读《现代Javascript高级教程》二十九、异步的终极解决方案:async/await
|
12月前
|
安全 JavaScript API
关于技术社区中的 Caveat 用法
关于技术社区中的 Caveat 用法
|
Python
谈一谈|如何利用函数的各种参数
谈一谈|如何利用函数的各种参数
77 0
|
C语言 C++
十分钟深入理解const用法(趣味故事)
十分钟深入理解const用法(趣味故事)
十分钟深入理解const用法(趣味故事)