您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何解決vue數組和對象渲染的問題的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
數組更新檢測
在 vue 中使用數組的push()、pop()、shift()、unshift()、splice()、sort()、reverse() 、filter()、concat() 方法時,改變數組的同時可以觸發視圖的變化。
注意: 有兩種情況 vue 無法檢測到變動的數組,分別是:
(1)直接操作數組的長度;
// Vue.set this.$set(arr, indexOfItem, newValue) // Array.prototype.splice this.arr.splice(indexOfItem, 1, newValue)
(2)利用索引直接設置一個項時,例如:this.arr[indexOfItem] = newValue
this.arr.splice(newLength)
demo如下:
<template> <div class="demo"> <div class="list-item" v-for="item in arr[0].elements" :key="item.name">{{item.name}}</div> <div class="change-btn" @click="changeArr">改變列表的值</div> </div> </template> <script> export default { data() { return { index: 0, arr: [{ elements: [{ name: '0' }, { name: '1' }, { name: '2' }] }] } }, methods: { changeArr() { // 可以改變數組的值 this.arr[0].elements.push({ name: '3' }) // this.arr[0].elements[1].name = '4' 可以改變數組的值 // this.arr[0].elements[1] = { 無法改變數組的值 // name: '4' // } } } } </script>
問題: 用v-for循環渲染數組數據時,數據更新了,視圖卻沒有更新
由于 JavaScript 的限制, Vue 不能檢測以下變動的數組:
1. 當你利用索引直接設置一個項時,例如: vm.items[indexOfItem] = newValue
2. 當你修改數組的長度時,例如: vm.items.length = newLength
解決方法:
為了避免第一種情況,以下兩種方式將達到像 vm.items[indexOfItem] = newValue 的效果, 同時也將觸發狀態更新:
// Vue.set Vue.set(example1.items, indexOfItem, newValue) (數組, 所引, 值) // Array.prototype.splice` example1.items.splice(indexOfItem, 1, newValue) (所引, 長度, 值)
避免第二種情況,使用 splice:
example1.items.splice(newLength)
對象更新檢測
方法一:this.$set()
方法二:Object.assign()
demo.vue
<template> <div class="demo"> {{object}} <div class="change-btn" @click="changeArr">改變列表的值</div> </div> </template> <script> export default { data() { return { index: 0, object: { name: 'haha' } } }, methods: { changeArr() { // 方法一: this.$set(this.object, 'age', 27) // 方法二: this.object = Object.assign({}, this.object, { age: 27 }) // 方法三: ---不可行 this.object.age = '27' } } } </script>
補充:
this.$forceUpdate()迫使 Vue 實例重新渲染。注意它僅僅影響實例本身和插入插槽內容的子組件,而不是所有子組件。
使用 v-if 在切換時,元素及它的綁定數據和組件都會被銷毀并重建
感謝各位的閱讀!關于“如何解決vue數組和對象渲染的問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。