Vue中watch用法详解

Vue中watch用法详解基本用法 当 firstName 值变化时 watch 监听到并且执行 div p FullName fullName p p FirstName inputtype text v model firstName inputtype text v model firstName p div newVue el root data firstName Dawei la

基本用法:

当firstName值变化时,watch监听到并且执行

<div> <p>FullName: { 
   { 
   fullName}}</p> <p>FirstName: <input type="text" v-model="firstName"></p> </div> new Vue({ 
    el: '#root', data: { 
    firstName: 'Dawei', lastName: 'Lou', fullName: '' }, watch: { 
    firstName(newName, oldName) { 
    this.fullName = newName + ' ' + this.lastName; } } }) 

handler方法和immediate属性:

上面的例子是值变化时候,watch才执行,我们想让值最初时候watch就执行就用到了handlerimmediate属性

watch: { 
    firstName: { 
    handler(newName, oldName) { 
    this.fullName = newName + ' ' + this.lastName; }, // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法,如果设置了false,那么效果和上边例子一样 immediate: true } } 

deep属性(深度监听,常用语对象下面属性的改变):

<div> <p>obj.a: { 
   { 
   obj.a}}</p> <p>obj.a: <input type="text" v-model="obj.a"></p> </div> new Vue({ 
    el: '#root', data: { 
    obj: { 
    a: 123 } }, watch: { 
    obj: { 
    handler(newName, oldName) { 
    console.log('obj.a changed'); }, immediate: true } } }) 

我们在在输入框中输入数据视图改变obj.a的值时,我们发现是无效的。受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。

默认情况下 handler 只监听obj这个属性它的引用的变化,我们只有给obj赋值的时候它才会监听到,比如我们在 mounted事件钩子函数中对obj进行重新赋值:

mounted: { 
    this.obj = { 
    a: '456' } } 

那么我们需要监听obj里的属性a的值呢?这时候deep属性就派上用场了:

watch: { 
    obj: { 
    handler(newName, oldName) { 
    console.log('obj.a changed'); }, immediate: true, deep: true } } 

这样的方法对性能影响很大,修改obj里面任何一个属性都会触发这个监听器里的 handler。我们可以做如下处理:

watch: { 
    'obj.a': { 
    handler(newName, oldName) { 
    console.log('obj.a changed'); }, immediate: true, // deep: true } } 

关于 watch的注销,实际开发中,watch会随着组件一并销毁。

参考文章: https://www.jianshu.com/p/b70f1668d08f

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228917.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午5:53
下一篇 2026年3月16日 下午5:54


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号