關(guān)于Vue ,key ,el-table, :row-key遇到的一個坑

vue前端開發(fā),經(jīng)常遇到key為undefine的bug,如圖


image.png

其實這個情況不是key為undefine,而是一個列表里key值重復(fù)了。

很多時候 我們把后臺返回的Id賦值給key,但是該死的后臺返回的Id居然也有重復(fù)的時候。
這個時候會出現(xiàn)各種意外情況,入頁面卡死,頁面空白,下拉列表點不動等等錯誤。

特別的el-table有寫特殊功能需要我們把row-key賦值,如果key重復(fù),渲染就會失敗。

為了防止key重復(fù),我們會想當然的認為返回一個隨機數(shù)字就可以了,所以會這樣返回一個隨機字符串
Math.random()+'';

但是這其實是有坑的,這只是解決了首次渲染的問題,但是第二次渲染時,有部分元素我們是希望他重復(fù)使用的,這樣渲染效率性能更好。而且很重要的,有些情況必須這樣。例如

   <div :key=" Math.random()+''" >
       <select>
              <option v-for="item in list">{{item.name}}</option>
         </select>
   </div>

這個情況會導(dǎo)致下拉框無法下拉,因為當下拉時頁面重新渲染,重新渲染又導(dǎo)致父元素被刪除了,所以無法下拉。

key在使用時我們要注意

1.在渲染時該識別為不同時,識別為相同

2.在渲染時該識別為相同,卻識別為了不同

key重復(fù) 就是 該為不同時卻識別為相同了
key一直隨機,就是該識別為相同 識別為不同了

下面提供一個生成key的函數(shù) 解決Key重復(fù),key隨機問題

  getRowKey(row) {
  /** 檢查row.id是否有重復(fù)的緩存對象 */
  if (!this.checkRepeatObj) {
    this.checkRepeatObj = {}
  }
  if (row) {
    if (row.id) {
      if (this.checkRepeatObj[row.id]) {
        if (!row._secondId) {
          row._secondId = Math.random() + ''
        }
        /** 方便根據(jù)key重用元素 */
        return row._secondId
      } else {
        this.checkRepeatObj[row.id] = 1
        return row.id
      }
    }
    console.log('row.id為空')
    if (!row._secondId) {
      row._secondId = Math.random() + ''
    }
    return row._secondId
  } else {
    console.log('row為空')
    return Math.random() + ''
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,242評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,656評論 1 32
  • 前端經(jīng)典面試題: 1、(前端面試題)https://zhuanlan.zhihu.com/p/84212558?f...
    who_are_you_閱讀 463評論 0 2
  • 前言 為了方便現(xiàn)在和以后前端學(xué)習(xí)和面試,在此收集和整理了Js相關(guān)的筆試面試題,供自己查閱的同時,希望也會對大家有所...
    蛙哇閱讀 1,903評論 0 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,562評論 19 139

友情鏈接更多精彩內(nèi)容