Vue进阶(八十九):watch 用法详解

2024-02-16 19:18

本文主要是介绍Vue进阶(八十九):watch 用法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 一、第一种方式
    • 二、第二种方式
    • 三、第三种方式
    • 四、监听数组变化
    • 五、注意事项⚠️
    • 六、拓展阅读


Vue中,应用watch来响应数据的变化,示例代码如下,

一、第一种方式

<input type="text" v-model="userName"/>  
//监听当userName值发生变化时触发
watch: {userName (newName, oldName) {console.log(newName)}
}

第一种方式有一个缺点: 就是当值第一次绑定的时候不会执行监听函数,只有当值改变的时候才会执行。

如果我们想在第一次绑定的时候就执行此监听函数,则需要设置immediatetrue。比如当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true

二、第二种方式

watch: {userName: {handler (newName, oldName) {console.log(newName)},immediate: true}
}

immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明时,立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler

当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

三、第三种方式

<input type="text" v-model="cityName.name" />
data (){return {cityName: {name:'北京',location: '中国'}}
},
watch: {cityName: {handler(newName, oldName) {console.log(newName)},immediate: true,deep: true}
}

注:监测对象的时候,newVal == oldVal

此时会给cityName的所有属性都加上监听函数,如果属性较多时,每个属性值的变化都会执行handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性

watch: {'cityName.name': {handler(newName, oldName) {console.log(newName)},immediate: true,deep: true}
}

四、监听数组变化

1.watch能监听到数组push时的改变,例如

data () {return {demo: [1,2]}
},mounted (){window.myVue = this},
watch: {demo(val){console.log(val)}
},myVue.demo.push(3)  //[1,2,3]

2.watch 不能检测以下变动的数组:

  • 当你利用索引直接设置一个项时,例如:myVue.demo[1] = 5
  • 当你修改数组的长度时,例如:myVue.demo.length = 2

此时,你可以删除原有键,再 $set 一个新的值,这样就可以触发watch

myVue.$set(myVue.demo,0,8)  // [8,2,3]

3.更复杂一点,对数组嵌套对象进行监听的时候,这时就需要深度监听。

data () {return {demo:[{name:'张三',age:18},{name:'李四',age:20}]}
},
mounted (){window.myVue = this
},
watch: {demo: {handler (val) {console.log(val)},// 这里是关键,代表递归监听 demo 的变化deep: true}
},myVue.demo[0].age = 30  //[{name:'张三',age:30},{name:'李四',age:20}]

五、注意事项⚠️

  • watch中不要使用箭头函数,因为箭头函数中的this是指向当前作用域.

六、拓展阅读

  • 《Vue进阶(八十四):Computed 和 Watch 使用与区别》
  • 《Vue进阶(八十三): updated和watch的区别》

这篇关于Vue进阶(八十九):watch 用法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/715447

相关文章

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Python Faker库基本用法详解

《PythonFaker库基本用法详解》Faker是一个非常强大的库,适用于生成各种类型的伪随机数据,可以帮助开发者在测试、数据生成、或其他需要随机数据的场景中提高效率,本文给大家介绍PythonF... 目录安装基本用法主要功能示例代码语言和地区生成多条假数据自定义字段小结Faker 是一个 python

Java Predicate接口定义详解

《JavaPredicate接口定义详解》Predicate是Java中的一个函数式接口,它代表一个判断逻辑,接收一个输入参数,返回一个布尔值,:本文主要介绍JavaPredicate接口的定义... 目录Java Predicate接口Java lamda表达式 Predicate<T>、BiFuncti

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化