在vue中,数据或对象里的值变化时,是无法被监听到的,除非在watch
下增加deep: true
深度监听。下面讲下vue如何在监听对象中变化,或指定某个属性监听其变化。
在说对象前,先来看一下单个变量数据监听如何使用immediate: true
data() { return { dvid: '', goodsInfo: [], userInfo:{}, closeTime:0,//关仓倒计时 } }, watch:{ closeTime(newVal, oldVal){ console.log(`${newVal} : ${oldVal}`); } },
注意:watch第一次绑定值的时候不会执行监听,如果需要第一次就执行监听 则需要设置:immediate: true
immediate 和 handler
watch 的用法有个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值得时候也执行函数,就需要用到 immediate 属性。
'currentParams.selOrgId': { handler(newV, oldV) { console.log("watch", newV, oldV) }, immediate: true }
deep 深度监听
当需要监听复杂的数据类型(对象)的改变时,普通的 watch 方法无法坚挺到对象内部属性的改变,此时就需要使用 deep 属性对对象进行深度监听。
currentParams: { handler (newV, oldV) { console.log('watch深度监听:', newV, oldV); }, deep: true }
watch深度监听 ,可以监听到对象中每个属性的变化,但是会给对象的所有属性都加上这个监听器,当对象属性较多时,每个属性值得变化都会执行 handler 。
以currentParams为例,监听selOrgId属性
data(){ return { currentParams: { selOrgId: '1' }, } }
1.通过input输入框触发watch
<input v-model="currentParams.selOrgId" /> data(){ return { currentParams: { selOrgId: '1',//声明不声明都可以触发watch }, } }, watch: { 'currentParams.selOrgId': (newV, oldV) => { console.log("watch", newV, oldV) }, },
2.通过js动态修改对象中属性值触发watch
data(){ return { currentParams: { }, } }, watch: { 'currentParams.selOrgId': (newV, oldV) => { console.log("watch", newV, oldV) }, }, methods: { triggerWatch () { 方法一、要监听的属性值(currentParams.selOrgId)不需要事先声明 this.currentParams=Object.assign({}, this.currentParams, {selOrgId: "改变后的值"}); 方法二、要监听的属性值(currentParams.selOrgId)不需要事先声明 this.$set(this.currentParams,'selOrgId',"改变后的值") 方法三、要监听的属性值(currentParams.selOrgId)需要事先声明,否则监听不到 this.currentParams.selOrgId = "改变后的值"; } }