Vue多層數(shù)據(jù)結(jié)構(gòu)響應式失效,視圖更新失敗問題
在表單設計和流程設計時,碰到多層數(shù)據(jù)響應式失效問題,當時也是一臉懵,找不到錯在哪里,運行代碼不報錯,就是不能響應式更新視圖了。
特此記錄一下填坑過程。
1、數(shù)據(jù)初始化結(jié)構(gòu)被破壞
表單配置需要config屬性,初始化時對象里沒有,導致vue響應式失效,因為在頁面完成渲染之后,vue就已經(jīng)完成了響應式綁定,對于監(jiān)聽且沒有屬性的字段將會失去數(shù)據(jù)的響應式,從而無法實時更新視圖。
先看看這個對象,是修復之前的結(jié)構(gòu)。
formDesign: {
process:{},
list: []
}
修復后的數(shù)據(jù)結(jié)構(gòu),每一個需要響應式的屬性,初始化頁面時都需要正確的結(jié)構(gòu)。
否則將失去響應式的后果。
formDesign: {
process:{},
list: [],
config: {}
}
2、js-delete刪除未觸發(fā)數(shù)據(jù)更新
在調(diào)用js刪除vue的data的數(shù)據(jù)后,既是傳入組件的data綁定sync屬性和watch監(jiān)聽都將變成徒勞的,因為js的delete更新不是鏈式響應式的,不會觸發(fā)vue的響應式數(shù)據(jù)驅(qū)動更新視圖。
當然這里針對是多層次數(shù)據(jù)結(jié)構(gòu),尤其是在流程設計,遞歸展示視圖和操作數(shù)據(jù)時最為常見。
解決辦法
使用vue的Vue.delete( target, propertyName/index )
官方解釋
- 刪除對象的 property。
- 如果對象是響應式的,確保刪除能觸發(fā)更新視圖。
- 這個方法主要用于避開 Vue 不能檢測到 property 被刪除的限制,但是你應該很少會使用它。
官方解釋—深層響應性
在 Vue 中,狀態(tài)都是默認深層響應式的。
這意味著即使在更改深層次的對象或數(shù)組,你的改動也能被檢測到。
你也可以直接創(chuàng)建一個淺層響應式對象。
它們僅在頂層具有響應性,一般僅在某些特殊場景中需要。
export default {
data() {
return {
obj: {
nested: { count: 0 },
arr: ['foo', 'bar']
}
}
},
methods: {
mutateDeeply() {
// 以下都會按照期望工作
this.obj.nested.count++
this.obj.arr.push('baz')
}
}
}
總結(jié)
每一個需要響應式的屬性,初始化頁面時都需要正確的data結(jié)構(gòu),不管數(shù)據(jù)結(jié)構(gòu)是否復雜,都應該保持Vue響應式的數(shù)據(jù)規(guī)范,避免踩坑,否則將失去響應式的后果。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue項目配置 webpack-obfuscator 進行代碼加密混淆的實現(xiàn)
這篇文章主要介紹了vue項目配置 webpack-obfuscator 進行代碼加密混淆,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
VUE3中Element table表頭動態(tài)展示合計信息
本文主要介紹了在Vue中實現(xiàn)動態(tài)合計兩個字段并輸出摘要信息的方法,通過使用監(jiān)聽器和深度監(jiān)聽,確保當數(shù)據(jù)變化時能正確更新合計結(jié)果,具有一定的參考價值,感興趣的可以了解一下2024-11-11
elementui實現(xiàn)標簽頁與菜單欄聯(lián)動的示例代碼
多級聯(lián)動是一種常見的交互方式,本文主要介紹了elementui實現(xiàn)標簽頁與菜單欄聯(lián)動的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-06-06

