鍍金池/ 問答/HTML/ vue 中 watch 失效

vue 中 watch 失效

data中有
clipboard.png

watch監(jiān)聽form
clipboard.png

直接用 this.form.cat_id=1_7eb3340579783ab51bf7e110f7a4f397,輸出this.form如下,watch不起效

clipboard.png

使用 this.$set(this.form,'cat_id','1_7eb3340579783ab51bf7e110f7a4f397'),輸出this.form如下,watch 起效

clipboard.png

我更加不理解的是用this.form.xx=yy修改其他值,功能又正常,這會是什么原因


我發(fā)現(xiàn)有個規(guī)律

form.cat_iddata 中賦值為 空字符串,this.form.cat_id="xxx" 不會觸發(fā) watch
form.cat_iddata 中賦值為非空字符串,this.form.cat_id="xxx" 會觸發(fā) watch
form.pdata 中賦值為 數(shù)值 1,this.form.o=2 則會觸發(fā) watch

回答
編輯回答
安若晴

watch有一個deep屬性的,可以試一下

2018年4月12日 02:29
編輯回答
神曲

我測試了一下,我這邊第一種形式也是可以的;

第一張截圖:
明顯pq屬性應(yīng)該是watch的,因為下面都有相應(yīng)的getset方法,但是并沒有cat_idgetset方法,也就是你的form里面的cat_id一開始的時候并沒有設(shè)置進去(至于為什么,我也不知道),也就是一開始form里面并沒有cat_id屬性,所以使用this.form.cat_id = ...屬于新增屬性,并不能被watch到,新增屬性只能通過this.$set的形式被watch。

因為qp都有getset方法,那應(yīng)該就是正常watch的,所以那樣修改沒有問題。
你是不是在某個地方刪除過cat_id這個屬性?

2018年5月30日 09:19
編輯回答
乞許

這樣就會生效了

watch:{
    'form.cat_id': function (newValue, oldValue) {
        ...
    }
}

我按照你的敲了一遍, 修改 p q cat_id 都可以生效 你看看

data(){
    return {
        form:{
            p:1,
            q:64,
            cat_id:'',
        }
    }
},
watch:{
    form:{
        handler(newValue, oldValue) {
            console.log("---nnn---")
        },
        deep: true
    }
},
mounted: function () { 
    setTimeout(()=>{
        this.form.cat_id="xxx"
        // this.form.q=2
    },2000)
}

2018年7月11日 20:18