Vue的监听属性Watch的详解

本文详细介绍了Vue.js中watcher的使用,包括其在属性变化时的监听机制,以及如何通过immediate属性实现初始值的处理。同时,讨论了props的规范写法,并展示了如何在组件间传递数据。此外,还探讨了deep属性在对象深度监听中的应用,以及如何通过优化避免不必要的性能消耗。最后,提供了关于props、watcher和性能优化的实例代码,帮助读者更好地理解和实践。
摘要由CSDN通过智能技术生成

各位小伙伴今天让我们一起来了解Watch我们这个经常用到它的一些用法,例子

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

当我们看到这个例子的watch时,这是我们最普遍的用法,当firstName变化时,就会触发watch监听,监听每次修改变化的新值,然后fullName进行修改操作。注意:这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行,若你的需求是最初绑定值的时候也执行函数,则就需要用到immediate属性如下

  • handler方法和immediate属性

当你父组件向子组件动态传值时,子组件的props首次获取到父组件传过来的默认值,也需要执行此监听函数时,此时就需要immediate改为true

//顺便让你们理解一下props的规范写法
props:{
			goodsData:{
				required: false, //可以使用required选项来声明这个参数是否必须传入。
				type: Array,
				default:()=>[] //数组类型
			},
			batchShow:{
				required:false,
				type:Boolean,
				default:false //布尔类型
			},
            firstName:{
               required:false,
			   type:String,
			   default:''   //String类型
            }
},


watch: {
  firstName: {
    handler(newName, oldName) {
      this.fullName = newName + ' ' + this.lastName;
    },
    // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法
    immediate: true
  }
}

注意到handler这个方法了吗,我们给 firstName 绑定了一个handler方法,之前我们的写法是省略写法,现在这个是完整的写法,因为watch 方法其实默认写的就是这个handler方法的。
immediate:true 立即执行---代表我们在 wacth 里声明了 firstName 之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行

  • deep属性

watch 里面还有一个属性 deep,默认值是 false,代表是否深度监听
当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

<input type="text" v-model="goods.price"/>
new Vue({
  el: '#sina',
  data: {
    goods:{
        number:1,
        price:100,    
    }
  },
  watch: {
    goods: {
      handler(newval, oldval) {
      // 进行对应的操作
    },
    deep: true,
    immediate: true
    }
  } 
})
  • 设置deep: true 则可以监听到goods.price的变化,但是此时会给goods的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。这样则会对我们的性能增加极大的负担,所以如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:
 watch: {
    'goods.price': {
      handler(newval, oldval) {
      // 进行操作
      },
      deep: true,
      immediate: true
    }
  }

这样优化就大大提升了性能,欢迎各位小伙伴有问题多多沟通呀

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值