Vue綁定對(duì)象與數(shù)組變量更改后無(wú)法渲染問(wèn)題解決
項(xiàng)目場(chǎng)景:
在頁(yè)面顯示上有一個(gè)<ul>標(biāo)簽,我們需要?jiǎng)討B(tài)進(jìn)行列表數(shù)據(jù)的展示,而由于我們的頁(yè)面上除了列表值,還有其他的值要進(jìn)行展示,因此列表數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)是某個(gè)對(duì)象下面的數(shù)組,在動(dòng)態(tài)修改數(shù)據(jù)后發(fā)現(xiàn)沒(méi)有進(jìn)行自動(dòng)渲染。
問(wèn)題描述:
在點(diǎn)擊按鈕“click me!”時(shí)雖然數(shù)據(jù)有變化且在控制臺(tái)進(jìn)行了輸出,但是列表數(shù)據(jù)并沒(méi)有發(fā)生渲染。
代碼如下:
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app">
<button @click="pushDataToDataList">click me!</button>
<ul>
<li v-for="(item, i) in form.dataList" :key="item">
{{ i + ":" + item }}
</li>
</ul>
</div>
<script>
let app = new Vue({
data: function() {
return {
form: {}
}
},
methods: {
pushDataToDataList() {
if (this.form.dataList == null) {
this.form.dataList = []
}
this.form.dataList.push("abc" + this.form.dataList.length)
console.log(this.form.dataList)
}
}
}).$mount('#app')
</script>

原因分析:
在查閱了官方文檔后我們發(fā)現(xiàn)下面這段話
由于 JavaScript 的限制,Vue 不能檢測(cè)數(shù)組和對(duì)象的變化。盡管如此我們還是有一些辦法來(lái)回避這些限制并保證它們的響應(yīng)性。
- 對(duì)于對(duì)象:Vue 無(wú)法檢測(cè) property 的添加或移除。由于 Vue 會(huì)在初始化實(shí)例時(shí)對(duì) property 執(zhí)行 getter/setter 轉(zhuǎn)化,所以 property 必須在
data對(duì)象上存在才能讓 Vue 將它轉(zhuǎn)換為響應(yīng)式的。- 對(duì)于數(shù)組:Vue 不能檢測(cè)以下數(shù)組的變動(dòng):
- 當(dāng)你利用索引直接設(shè)置一個(gè)數(shù)組項(xiàng)時(shí),例如:
vm.items[indexOfItem] = newValue- 當(dāng)你修改數(shù)組的長(zhǎng)度時(shí),例如:
vm.items.length = newLength
原因到這里就明了了,我們的數(shù)據(jù)沒(méi)有進(jìn)行渲染是因?yàn)樵谝婚_(kāi)始,data下的form中就沒(méi)有dataList這個(gè)屬性,因此在后續(xù)即使該值產(chǎn)生了變化,Vue也就無(wú)法檢測(cè)到它的改變。而且不僅僅是對(duì)數(shù)組,即使是js對(duì)象也是一樣的。除此之外,直接按下標(biāo)修改數(shù)組的元素,也不會(huì)觸發(fā)視圖渲染。
會(huì)觸發(fā)數(shù)組渲染的有以下數(shù)組方法:
- push(element) // 在數(shù)組末尾添加元素
- pop() // 刪除數(shù)組最后一個(gè)元素并將其返回
- shift() // 刪除數(shù)組第一個(gè)元素并將其返回
- unshift(ele1, ele2, …, eleN) // 向數(shù)組的開(kāi)頭添加一個(gè)或更多元素,并返回新的長(zhǎng)度
- splice(start, deleteCount?, …item) // 刪除數(shù)組中的元素并在該元素所在位置替換為新元素
- sort() // 對(duì)數(shù)組進(jìn)行排序,會(huì)修改數(shù)組元素的位置
- reverse() // 倒轉(zhuǎn)數(shù)組元素,會(huì)修改數(shù)組元素的位置
解決方案:
1.在data下的form對(duì)象中,設(shè)置dataList屬性。由于前端在對(duì)數(shù)據(jù)進(jìn)行處理時(shí)就知道代碼的結(jié)構(gòu)是什么,提前設(shè)置好了也便于后續(xù)的開(kāi)發(fā)理解。建議使用
data: function() {
return {
form: {
dataList: null
}
}
}
2.使用this.$set()方法
pushDataToDataList() {
if (this.form.dataList == null) {
// 先在form下設(shè)置下dataList屬性
this.$set(this.form, 'dataList', [])
}
this.form.dataList.push("abc" + this.form.dataList.length)
console.log(this.form.dataList)
}
參考鏈接
Vue檢測(cè)數(shù)據(jù)變化的注意事項(xiàng)
到此這篇關(guān)于Vue綁定對(duì)象與數(shù)組變量更改后無(wú)法渲染問(wèn)題解決的文章就介紹到這了,更多相關(guān)Vue綁定對(duì)象與數(shù)組變量更改后無(wú)法渲染問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Vue webapp項(xiàng)目通過(guò)HBulider打包原生APP(vue+webpack+HBulider)
這篇文章主要介紹了詳解Vue webapp項(xiàng)目通過(guò)HBulider打包原生APP(vue+webpack+HBulider),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Vue keepAlive頁(yè)面強(qiáng)制刷新方式
這篇文章主要介紹了Vue keepAlive頁(yè)面強(qiáng)制刷新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Nuxt3:拉取項(xiàng)目模板失敗問(wèn)題以及解決
文章描述了在使用官網(wǎng)命令創(chuàng)建Nuxt3項(xiàng)目時(shí)遇到的問(wèn)題,通過(guò)分析命令,推測(cè)問(wèn)題出在拉取項(xiàng)目模板失敗,解決方法是手動(dòng)訪問(wèn)并下載項(xiàng)目模板,解壓后按照官網(wǎng)教程安裝依賴(lài)并啟動(dòng),最終成功解決問(wèn)題2024-12-12
Vue實(shí)現(xiàn)開(kāi)始時(shí)間和結(jié)束時(shí)間范圍查詢
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)開(kāi)始時(shí)間和結(jié)束時(shí)間的范圍查詢,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Vue在 Nuxt.js 中重定向 404 頁(yè)面的方法
這篇文章主要介紹了Vue在 Nuxt.js 中重定向 404 頁(yè)面的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Vue3中的ref和reactive響應(yīng)式原理解析
這篇文章主要介紹了Vue3中的ref和reactive響應(yīng)式,本節(jié)主要介紹了響應(yīng)式變量和對(duì)象,以及變量和對(duì)象在響應(yīng)式和非響應(yīng)式之間的轉(zhuǎn)換,需要的朋友可以參考下2022-08-08
關(guān)于vue-router路徑計(jì)算問(wèn)題
這篇文章主要介紹了關(guān)于vue-router路徑計(jì)算問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05

