Vue中watch监听的用法

1、基本用法:

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

<template>
  <div class="watch">
    <p>FullName: {{ fullName }}</p>
    <p>FirstName: <input type="text" v-model="firstName" /></p>
  </div>
</template>
<script>
export default {
  name: "listen",
  data() {
    return {
      firstName: "Dawei",
      lastName: "Lou",
      fullName: ""
    };
  },
  watch: {
    // 普通监听
    firstName(newName, oldName) {
      this.fullName = newName + " " + this.lastName;
    },
  },
};
</script>

2、handler方法和immediate属性:

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

immediate:组件加载立即触发回调函数执行,

deep: 深度监听,为了发现 对象内部值的变化,复杂类型的数据时使用,例如数组中的对象内容的改变,注意监听数组的变动不需要这么做。注意:deep无法监听到数组的变动和对象的新增,参考vue数组变异,只有以响应式的方式触发才会被监听到。

watch: {
	// handler方式监听
  firstName: {
    handler(newName, oldName) {
      this.fullName = newName + ' ' + this.lastName;
    },
    // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法,
    // 如果设置了false,那么效果和上边例子一样
    immediate: true
  }
}
3、deep属性(深度监听,常用语对象下面属性的改变):
<template>
  <div class="watch">
    <p>FullName: {{ obj.fullName }}</p>
    <p>FirstName: <input type="text" v-model="obj.firstName" /></p>
  </div>
</template>
<script>
export default {
  name: "listen",
  data() {
    return {
      obj: {
        firstName: "Dawei",
        lastName: "Lou",
        fullName: ""
      },
    };
  },
  watch: {
    // handler方式监听
  obj: {
    handler(newName, oldName) {
      console.log('obj.firstName changed!!')
    },
    immediate: true
  },
};
</script>

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

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

mounted: {
  this.obj = {
    firstName: 'jyy'
  }
}

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

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

这样的方法对性能影响很大,修改obj里面任何一个属性都会触发这个监听器里的 handler。我们可以对需要修改的具体值进行监听:

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

对象中某个值的监听,就不需要deep属性也可以监听到了

watch的注销这里就不在多说了,实际开发中,watch会随着组件一并销毁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值