Vue用v-for資料更新後檢視並沒更新--框架使用的是iview
阿新 • • 發佈:2020-11-04
直接上反面示例 html,html直接是一個普通的v-for
// <Row>是iview的元件裡的標籤 <Row>這裡是一些元素</Row><div class="admission-card" v-for="item in admissionList" :key="item.id" > <div class="admission-card-body"> <div class="head flexbox between"> <div>{{item.name}}</div> </div> </div> </div> </div>
data裡面也給了預設值
data () { return { admissionList: [],mounted(){ this.admissionList=JSON.parse(JSON.stringify(this.bventAdmissionData)) },
bventAdmissionData:[
{name:'李四'},
{name:'張三'}
] } },
methods: { searchAdmissionList () { const myData= JSON.parse(JSON.stringify(this.bventAdmissionData)) if (this.query) { // this.$set(this,'admissionList',myData.filter(item => item.name.indexOf(this.query) >= 0)) this.admissionList = myData.filter(item => item.name.indexOf(this.query) >= 0) } else { // this.$set(this,'admissionList',myData)this.admissionList = myData } }
}
看起來完全沒有問題,但是很奇怪的事情發生了,頁面顯示admissionList是有值的,但是檢視沒有渲染,如下圖
這時解決問題的思路首先想到幾個
1.確認data裡給了預設值
2.陣列賦值改為$set的方式--沒有用
然後試了2個奇怪的解決辦法
1.data裡admissionList的預設值修改為[{}]--檢視成功渲染
2.mounted生命週期改為created,檢視渲染前改陣列 ---檢視成功渲染
解決這個問題之後,做了個搜尋功能,奇怪的事情又發生了,第一次搜尋結果正確,如下圖
但是清空條件之後再搜尋,問題又出現了,admissionList是有4個值的,但是檢視沒有重新整理,還是2個值,資料和檢視沒有繫結的感覺
然後試了各種方法,用computed計算屬性,用上面的註釋程式碼$set,完全沒有用,折騰了半天,最後以一種奇葩的方式解決了!
給html的</Row>標籤下面的div包一個</Row>標籤,然後所有的問題完美解決。。。有人知道原理的可以留言一下
結論:
1.完全按照標準寫程式碼
2.data的預設值一定要存在
3.可以用$set改陣列嘗試一下
4.iview遇到過許多次型別的問題,典型的就是table元件改row上繫結的值,並不會改變原始陣列,讓table元件的slot-scope="{row}"裡插的事件幾乎失去作用