2021-03-26 vue的provide和inject無(wú)法實(shí)時(shí)響應(yīng)踩坑

vue中的provide可以進(jìn)行父組件向后代組件進(jìn)行傳值。但是,他沒(méi)辦法監(jiān)聽(tīng)傳輸數(shù)據(jù)的變化。或者說(shuō)明白點(diǎn),就是如果我在父組件改變注入的值,它沒(méi)辦法更新。子組件改變傳入的值,它也沒(méi)辦法進(jìn)行更新

vue官方說(shuō)明:https://cn.vuejs.org/v2/api/#provide-inject

在線測(cè)試地址:https://codesandbox.io/s/snowy-forest-zed14

我們經(jīng)過(guò)測(cè)試發(fā)現(xiàn):

// 父組件
provide: function() {
    this.myData3 = Vue.observable({
      val: "我沒(méi)改變",
    });
    return {
      myData1: this.myData1, //非響應(yīng)
      myData2: this.myData2, //響應(yīng)
      myData3: this.myData3, //響應(yīng)
    };
},
data() {
    return {
      myData1: "我沒(méi)改變",
      myData2: {
        val: "我沒(méi)改變",
      },
    };
},
methods: {
    change(){
      this.myData1 = "我改變了" // 觸發(fā)后不能改變
      this.myData2.val = "我改變了" // 觸發(fā)后能改變
      this.myData3.val = "我改變了" // 觸發(fā)后能改變
      // 觸發(fā)后不能改變
      this.myData2 = {
        val: "我改變了",
      } 
      // 觸發(fā)后不能改變
      this.myData3 = {
        val: "我改變了",
      } 
    },
}


// 孫組件
 inject: ["myData1", "myData2", "myData3"],

以上這幾種方式都無(wú)法響應(yīng)和對(duì)一整個(gè)對(duì)象賦值的改變,并且watch和computed也無(wú)法監(jiān)聽(tīng)到一整個(gè)對(duì)象賦值的改變,只能響應(yīng)和監(jiān)聽(tīng)某個(gè)對(duì)象中的屬性改變,這不符合我們的使用習(xí)慣,我們希望可以對(duì)一整個(gè)對(duì)象賦值并監(jiān)聽(tīng)它的改變

如果我們希望整個(gè)數(shù)據(jù)都是響應(yīng)式的。那么可以通過(guò)以下方法實(shí)現(xiàn):

我們可以讓provide提供一個(gè)函數(shù)。函數(shù)內(nèi)部返回一個(gè)響應(yīng)式的數(shù)據(jù)。此時(shí)整條數(shù)據(jù)的響應(yīng)式的狀態(tài)并不會(huì)丟失。

而且這樣做有一個(gè)好處,即無(wú)法直接修改myData4 的值,因?yàn)樗且粋€(gè)計(jì)算屬性。這樣就可以避免數(shù)據(jù)的混亂。

關(guān)鍵代碼如下:

// 父組件
provide: function () {
    return {
      myData4: () => this.myData4, //響應(yīng)
    };
},
data() {
    return {
      myData4: {
        val: "我沒(méi)改變",
      },
    };
 },
methods: {
    change() {
      // 觸發(fā)后能改變
      this.myData4 = {
        val: "我改變了",
      };
    },
},


// 孫組件
inject: ["myData4"],
computed: {
    computedMyData4() {
      return this.myData4()
    }
},
watch: {
    computedMyData4(val) {
      console.log("我是孫組件,我監(jiān)聽(tīng)到了myData4改變", val);
    },
},
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容