1. 程式人生 > 實用技巧 >Vue用v-for資料更新後檢視並沒更新--框架使用的是iview

Vue用v-for資料更新後檢視並沒更新--框架使用的是iview

直接上反面示例 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: [],
    bventAdmissionData:[
      {name:'李四'},
      {name:'張三'}
    ] } },
mounted(){ this.admissionList=JSON.parse(JSON.stringify(this.bventAdmissionData)) },
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}"裡插的事件幾乎失去作用