vue中watch不觸發(fā)、不生效的解決辦法及原理

@TOC

遇到的問題

在深層props過程中,props的數(shù)據(jù)傳到了目標(biāo)文件 但卻沒有觸發(fā)數(shù)據(jù)更新及頁(yè)面更新;
watch代碼如下:

  watch: {
  uploaConfig(newVal,oldVal){
   if (this.uploadConfig.moreList && this.uploadConfig.moreList.length > 0) {
        this.moreList = newVal.moreList
        }
    }
  },

vue-devToola數(shù)據(jù)傳遞結(jié)果如下


在這里插入圖片描述

方案解決過程一

考慮到使用了對(duì)象傳遞 watch可能無(wú)法檢測(cè)到深層key屬性變化,代碼改成如下:

 watch: {
     'uploaConfig.moreList': {
          handler (newVal) {
          if (this.uploadConfig.moreList && this.uploadConfig.moreList.length > 0) {
            this.moreList = newVal.moreList
            }
          },
          deep: true
        }
    },

結(jié)果顯而易見 還是不行;

方案解決過程二

查閱: vue官方文檔.得知如果是想watch檢測(cè)到值變化并且立刻使用則需要加上 immediate: true,

watch: {
        'uploaConfig.moreList': {
          handler (newVal) {
          if (this.uploadConfig.moreList && this.uploadConfig.moreList.length > 0) {
            this.moreList = newVal.moreList
            }
          },
          deep: true,
          immediate: true,
        }
    }

最后博主問題終于得到解決了


在這里插入圖片描述

總結(jié):

出現(xiàn)問題盡量先找官網(wǎng) 首先確定是自己沒有了解到官方api的正確使用或者是一些特定解決方案,如若對(duì)您有幫助,麻煩點(diǎn)個(gè)贊吧~

20190626更新 | 原文并沒有解釋清楚為何加上 deep: true或者 immediate: true就可以了,此次更新將加入demo

更新內(nèi)容

1 常規(guī)的監(jiān)聽(watch)

<div class="watch-demo">
    <div class="watch-demo-item">
      <input type="text" v-model="val1">
      <div>{{value1}}</div>
    </div>
  </div>
// ...
data () {
    return {
      val1: '',
      value1: ''
    }
  },
  watch: {
    val1 (val, oval) {
      this.value1 = val
    }
  },
  methods: {
  }

輸出:


常規(guī)監(jiān)聽
  • 從上圖可以看出,常規(guī)的監(jiān)聽和我們想象中的完全一致,理想和實(shí)際完美吻合;

2 對(duì)象監(jiān)聽

 <div class="watch-demo-item">
      <input type="text" v-model="obj.val2">
      <div>{{value2}}</div>
    </div>
// ...

data () {
    return {
      val1: '',
      value1: '',
      obj: {
        val2: ''
      },
      value2: ''
    }
  },
  watch: {
    val1 (val, oval) {
      this.value1 = val
    },
    obj (val, oval) {
      this.value2 = val.val2
    }
  },
  methods: {
  }

輸出結(jié)果:


對(duì)象監(jiān)聽
  • 咦 為何剛才沒問題,對(duì)象就有問題呢

方法一: 代碼調(diào)整如下:

 data () {
    return {
      val1: '',
      value1: '',
      obj: {
        val2: ''
      },
      value2: ''
    }
  },
  watch: {
    val1 (val, oval) {
      this.value1 = val
    },
    'obj.val2' (val, oval) {
      this.value2 = val
    }
  },
  methods: {
  }

此時(shí)頁(yè)面輸出:


方法一

但現(xiàn)實(shí)開發(fā)過程中,我們的obj對(duì)象很難確定里面的key數(shù)量,假如很多個(gè)key的時(shí)候,總不能寫多個(gè)監(jiān)聽去監(jiān)聽key吧? 此時(shí)還有一種方法 如下

方法二

data () {
    return {
      val1: '',
      value1: '',
      obj: {
        val2: ''
      },
      value2: ''
    }
  },
  watch: {
    val1 (val, oval) {
      this.value1 = val
    },
    'obj': {
      handler (val, oval) {
        this.value2 = val.val2
      },
      deep: true
    }
  },

此時(shí)輸出如下

方法二

解釋:handler是watch的高級(jí)用法,里面有一個(gè)屬性 deep,默認(rèn)值是 false,代表是否深度監(jiān)聽, 還有一個(gè)屬性 immediate,默認(rèn)值也是 false ,但immediate:true代表如果在 wacth 里聲明了之后,就會(huì)立即先去執(zhí)行里面的handler方法,如果為 false就跟我們以前的效果一樣,不會(huì)在綁定的時(shí)候就執(zhí)行。deep深度監(jiān)聽會(huì)影響性能; 兩者可以同時(shí)存在;

此次代碼演示demo請(qǐng)轉(zhuǎn) 王一諾watchDemo.vue

如果對(duì)你有幫助麻煩點(diǎn)個(gè)贊??

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,178評(píng)論 0 29
  • vue概述 在官方文檔中,有一句話對(duì)Vue的定位說的很明確:Vue.js 的核心是一個(gè)允許采用簡(jiǎn)潔的模板語(yǔ)法來聲明...
    li4065閱讀 7,624評(píng)論 0 25
  • 一:什么是閉包?閉包的用處? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在本質(zhì)上,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 10,037評(píng)論 1 52
  • 組件(Component)是Vue.js最核心的功能,也是整個(gè)架構(gòu)設(shè)計(jì)最精彩的地方,當(dāng)然也是最難掌握的。...
    六個(gè)周閱讀 5,770評(píng)論 0 32
  • 姓名:游向囯 公司:海南蔚藍(lán)時(shí)代實(shí)業(yè)有限公司 組別:上海第361期感動(dòng)一組 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》大綱1遍 共...
    莜面山藥蛋閱讀 133評(píng)論 0 0

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