关于Vue ,key ,el-table, :row-key遇到的一个坑

vue前端开发,经常遇到key为undefine的bug,如图


image.png

其实这个情况不是key为undefine,而是一个列表里key值重复了。

很多时候 我们把后台返回的Id赋值给key,但是该死的后台返回的Id居然也有重复的时候。
这个时候会出现各种意外情况,入页面卡死,页面空白,下拉列表点不动等等错误。

特别的el-table有写特殊功能需要我们把row-key赋值,如果key重复,渲染就会失败。

为了防止key重复,我们会想当然的认为返回一个随机数字就可以了,所以会这样返回一个随机字符串
Math.random()+'';

但是这其实是有坑的,这只是解决了首次渲染的问题,但是第二次渲染时,有部分元素我们是希望他重复使用的,这样渲染效率性能更好。而且很重要的,有些情况必须这样。例如

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

这个情况会导致下拉框无法下拉,因为当下拉时页面重新渲染,重新渲染又导致父元素被删除了,所以无法下拉。

key在使用时我们要注意

1.在渲染时该识别为不同时,识别为相同

2.在渲染时该识别为相同,却识别为了不同

key重复 就是 该为不同时却识别为相同了
key一直随机,就是该识别为相同 识别为不同了

下面提供一个生成key的函数 解决Key重复,key随机问题

  getRowKey(row) {
  /** 检查row.id是否有重复的缓存对象 */
  if (!this.checkRepeatObj) {
    this.checkRepeatObj = {}
  }
  if (row) {
    if (row.id) {
      if (this.checkRepeatObj[row.id]) {
        if (!row._secondId) {
          row._secondId = Math.random() + ''
        }
        /** 方便根据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() + ''
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,545评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 前端经典面试题: 1、(前端面试题)https://zhuanlan.zhihu.com/p/84212558?f...
    who_are_you_阅读 371评论 0 2
  • 前言 为了方便现在和以后前端学习和面试,在此收集和整理了Js相关的笔试面试题,供自己查阅的同时,希望也会对大家有所...
    蛙哇阅读 1,857评论 0 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139