vue2?element-ui?el-checkbox視圖不更新問(wèn)題及解決
vue2 element-ui el-checkbox視圖不更新
今天在開(kāi)發(fā)過(guò)程發(fā)現(xiàn)一個(gè)問(wèn)題,如標(biāo)題所描述的,我在更改了data(){return{}}里的數(shù)據(jù)后, 也就是對(duì) el-checkbox 的 v-model 綁定了一個(gè) data() 里面的數(shù)據(jù),與之對(duì)應(yīng)的視圖沒(méi)有發(fā)生變化
我之所以 斷定 我data() 里的數(shù)據(jù)發(fā)生了變化,而視圖沒(méi)有發(fā)生變化,是因?yàn)?在chrome 的 插件 vue devtools 中 確認(rèn)了 data() 數(shù)據(jù)是發(fā)生了改變, 也就證明el-checkbox 的v-model綁定的boolean 值發(fā)生了改變,此時(shí)視圖應(yīng)該 按照 v-model="false" ==> v-model="true" 從 未勾選狀態(tài)==>勾選狀態(tài) 但是 頁(yè)面一直沒(méi)有更新。
在確認(rèn)自己不是因?yàn)榈图?jí)錯(cuò)誤而導(dǎo)致的 視圖不更新后, 對(duì)該問(wèn)題進(jìn)行了 不同的處理
1: 百度: 使用 $set() 、使用froceUpdate() 這兩者都不起作用
既然 已經(jīng)明確了 數(shù)據(jù)是發(fā)生了變化,依賴數(shù)據(jù)的視圖沒(méi)有發(fā)生改變, 那么 可以通過(guò) 較為偏激的方法 用v-if="true" / v-if="false" 的方法 將組件銷毀再重新掛載, (此種方法過(guò)于 偏激,而且相對(duì)另類 不推薦使用)
既然有通過(guò) v-if 的方法 強(qiáng)行讓 元素重新渲染,那么 是否可以利用 vue 的一些特性進(jìn)行類似的操作呢?
我個(gè)人觀點(diǎn)
vue 響應(yīng)式 可以通過(guò) 數(shù)據(jù)驅(qū)動(dòng)頁(yè)面的更新 加上 diff算法, 可以試著給 el-checkbox 組件 一個(gè) 無(wú)關(guān)緊要的屬性
例如 :
data-xxx=“響應(yīng)式數(shù)據(jù)” 通過(guò)更改 該響應(yīng)式數(shù)據(jù) 讓vue 在進(jìn)行diff算法中,發(fā)現(xiàn)虛擬Dom el-checkbox 的其中一個(gè) data-xxx 屬性發(fā)生變化,從而 讓其觸發(fā)該組件的 渲染,以達(dá)到 v-model 綁定的值改變 所對(duì)應(yīng)的 視圖發(fā)生變化。
- 例子:
<el-checkbox v-model="list[index].obj[value].checked" :data-a="checked">
- 偽代碼:
function changeValue(){ // 將 list[index].obj[value].checked 為 false 改為 true this.list[index].obj[value].checked = true // 此時(shí)視圖 并沒(méi)有因?yàn)?數(shù)據(jù)的變化 而 從 未勾選變成勾選狀態(tài) // 更改一個(gè) 無(wú)關(guān)緊要的 數(shù)值 this.checked = !this.checked // 此處 無(wú)論checked 是什么 都不影響 目的是讓vue 去重新渲染 el-checkbox 這個(gè)組件 }
總結(jié)
其實(shí)在一般的vue 開(kāi)發(fā)中,如果 響應(yīng)式數(shù)據(jù) 不是那種 非常復(fù)雜的數(shù)據(jù)類型一般不會(huì)出現(xiàn)響應(yīng)式數(shù)據(jù)變化而視圖不更行的情況,
但 上述例子中 list是一個(gè)數(shù)組,數(shù)組里面有多個(gè)屬性,其中一個(gè)屬性為一個(gè)對(duì)象,而我們需要改變的值就是這個(gè)對(duì)象的其中一個(gè)屬性, 可能 在vue 的雙向綁定中,
由于 list 是一個(gè)相對(duì)復(fù)雜的數(shù)據(jù)類型,當(dāng)深層次里的屬性發(fā)生了 改變, vue沒(méi)法做到 數(shù)據(jù)驅(qū)動(dòng) 視圖更新,
當(dāng)我們非常確認(rèn)數(shù)據(jù)已經(jīng)更新了, 僅僅是視圖沒(méi)有發(fā)生變化,此時(shí) 要做的就是 能讓 視圖發(fā)生改變的操作 通過(guò)改變一個(gè)無(wú)關(guān)緊要的 響應(yīng)式數(shù)據(jù) 從而 讓 組件進(jìn)行 重新渲染操作 無(wú)疑是一個(gè) 不錯(cuò)的 解決方案
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 如何用vue2+element-ui實(shí)現(xiàn)多行行內(nèi)表格編輯
- vue2+element-ui新增編輯表格+刪除行功能
- Vue2+Element-ui實(shí)現(xiàn)el-table表格自適應(yīng)高度的案例
- vue2+element-ui+nodejs實(shí)現(xiàn)圖片上傳和修改圖片到數(shù)據(jù)庫(kù)的方法
- vue2結(jié)合element-ui實(shí)現(xiàn)TreeSelect樹選擇功能
- vue2+element-ui使用vue-i18n進(jìn)行國(guó)際化的多語(yǔ)言/國(guó)際化詳細(xì)教程
相關(guān)文章
el-tree樹組件懶加載(后端上千條數(shù)據(jù)前端進(jìn)行處理)
本文主要介紹了el-tree樹組件懶加載(后端上千條數(shù)據(jù)前端進(jìn)行處理),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03vuejs手把手教你寫一個(gè)完整的購(gòu)物車實(shí)例代碼
這篇文章主要介紹了vuejs-手把手教你寫一個(gè)完整的購(gòu)物車實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07代替Vue?Cli的全新腳手架工具create?vue示例解析
這篇文章主要為大家介紹了代替Vue?Cli的全新腳手架工具create?vue示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10從vue-router看前端路由的兩種實(shí)現(xiàn)
本文由淺入深觀摩vue-router源碼是如何通過(guò)hash與History interface兩種方式實(shí)現(xiàn)前端路由,介紹了相關(guān)原理,并對(duì)比了兩種方式的優(yōu)缺點(diǎn)與注意事項(xiàng)。最后分析了如何實(shí)現(xiàn)可以直接從文件系統(tǒng)加載而不借助后端服務(wù)器的Vue單頁(yè)應(yīng)用。2021-05-05Vue項(xiàng)目中引入外部文件的方法(css、js、less)
本篇文章主要介紹了Vue項(xiàng)目中引入外部文件的方法(css、js、less),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-07-07vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn)
這篇文章主要介紹了vue大型項(xiàng)目之分模塊運(yùn)行/打包的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09