在vue和react中(只学了这两个),经常需要渲染元素到DOM上,而且如果不写key,有的浏览器会进行报错或者进行提示。

在我的理解里:key其实就是一个身份的标识,证明这个位置坐的就是这个人。后期其他的人来到后坐其他的位置,这样就不影响自身的位置,从而不用重新确认。

用比较官方的话说就是,当状态的数据发生变化时,框架中的diff算法会根据新数据生成新的 虚拟DOM ,与原先的旧虚拟DOM进行比较:

第一种:在旧的虚拟DOM内找到和新的虚拟DOM相同的key

  (1)对比后发现虚拟DOM的中的内容没有变化,直接使用之前的真实DOM

  (2)若新的虚拟DOM的内容变化了,则生成新的真实DOM,替换之前生成真实DOM

第二种:旧的虚拟DOM未找到和新的虚拟DOM相同的key

    根据新数据创建新的真实DOM,渲染到界面上

但是这里就引发了一个问题,为何不建议用随机数和index作为标识呢?此处写的是不建议,不是不能用!

用index作为key会发生的问题:

1.对数据进行 逆向添加,逆向删除等破坏顺序的操作:

直接导致index的顺序重新排列,使得整个数据重新进行真实DOM更新,举个例子

在2000条数据内,往头节点插入一条数据,这时候原本头节点的index为0,现在变成了1,新增加的数据的index为0,在diff算法中发现所有的index所对应的数据都不对,从而进行2001条数据渲染,而不是只对当前这一条新增数据进行真实DOM添加,影响开发的效率

2.结构类中包含输入类的DOM

会导致输入框的数据出错,再次(点击添加输入框操作等)渲染数据时,发生输入框的数据错乱

用随机数作为key的问题:

如果从上面看下来的话,其实为什么不用随机数的问题也很好解决,用随机数会让数据更新时,每次都整体重新渲染,大大降低了效率问题

后话

如果我们不存在对数据的逆向添加这些破坏顺序的操作,就是为了展示的话,用index作为key也是可以的,这也就是为什么前面说不建议而不是不能

那么怎么使用key进行数据标识呢?

1)如果要设置唯一标识的话,此处的key可以设置成id,手机号,身份证号,学号等唯一值

2)如果只是为了展示数据,用index也是可以的

欢迎大家进行评论指正

关于diffing算法中key的使用的更多相关文章

  1. 七天接手react项目 —— 生命周期&受控和非受控组件&Dom 元素&Diffing 算法

    生命周期&受控和非受控组件&Dom 元素&Diffing 算法 生命周期 首先回忆一下 vue 中的生命周期: vue 对外提供了生命周期的钩子函数,允许我们在 vue 的各个 ...

  2. redis中key的过期键删除策略

    Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...

  3. 天气预报接口:SmartWeather API中key的计算方法

    这个代码大家都蛮感兴趣,我在git开源了一个用于收集天气信息的系统,基于python语言的,请大家参考: https://github.com/BerlinSun/WeatherForecast -- ...

  4. 直接操作DOM一定比虚拟DOM操作耗时,diff算法,key值,虚拟 DOM的定义

    直接操作DOM一定比虚拟DOM操作耗时吗? 或者一次直接DOM操作一定比一次虚拟DOM操作耗时吗? 1)虚拟DOM的本质就是一个JS对象,虚拟DOM减少了真实DOM的操作,当修改数据的时候,就是修改虚 ...

  5. React中key的讲解

    通过阅读React的文档我们知道React这个框架的核心思想是,将页面分割成一个个组件,一个组件还可能嵌套更小的组件,每个组件有自己的数据(属性/状态);当某个组件的数据发生变化时,更新该组件部分的视 ...

  6. v-for中key的作用与原理

    一.虚拟DOM中key的作用 key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后Vue会对新虚拟DOM与旧虚拟DOM的差异进行比较. 二.如何选择key 最好使 ...

  7. KMP算法中next函数的理解

    首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ...

  8. STL源码中map和set中key值不能修改的实现

    前言 最近正好刚刚看完,<stl源码剖析>这本书的map和set的源码部分.但是看完之后又突然发现,之前怎么没有注意到map和set容器中key不能修改是怎么实现的.故,特此整理如下. s ...

  9. 简明解释算法中的大O符号

    伯乐在线导读:2009年1月28日Arec Barrwin在StackOverflow上提问,“有没有关于大O符号(Big O notation)的简单解释?尽量别用那么正式的定义,用尽可能简单的数学 ...

随机推荐

  1. 【LeetCode】剑指 Offer 04. 二维数组中的查找

    二维数组查找:线性查找法 有二维数组: [  [1,   4,  7, 11, 15],  [2,   5,  8, 12, 19],  [3,   6,  9, 16, 22],  [10, 13, ...

  2. FineGAN

    目录 概 主要内容 隐变量 背景 轮廓 色彩和纹理 用于无监督分类 代码 Singh K., Ojha U. & Lee Y. FineGAN: Unsupervised Hierarchic ...

  3. Java基础周测一、二(50题)

    一.单选题 (共50题,250分) 1.下列选项不可作为Java语言变量名的是(    ). A. a1 B. $1 C. _1 D. 21 正确答案: D 2.有一段Java应用程序,它的类名是a1 ...

  4. Kafka单机安装Version1.0.1(自带Zookeeper)

    1.说明 Kafka单机安装,基于版本1.0.1, 使用kafka_2.12-1.0.1.tgz安装包, 其中2.12是编译工具Scala的版本. 而且不需要另外安装Zookeeper服务, 使用Ka ...

  5. SpringBoot 中过滤器的简介及使用方式

    过滤器简介 过滤器依赖Servlet容器,属于Servlet规范的一部分. 在实现上基于Servlet容器的函数回调,可以对几乎所有请求进行过滤. Filter的生命周期由Servlet容器管理. 过 ...

  6. win10 安装vb -打开后一直显示无响应-解决

    1.成功安装vb ,美滋滋的运行 ,但是一直卡在无响应状态, 2.解决 使用管理员权限打开即可,也可以更改兼容为win7/8, 神奇的是,我这电脑自用过一次管理员权限打开,后面再使用vb可以不用管理员 ...

  7. win10 防火墙配置 允许局域网其他设备访问本地工程

    1.进入防护墙并找到高级设置 2.选择属性 3.将入站连接设为允许,有三个别忘了,[域配置文件,专用配置文件,公用配置文件]

  8. git 不小心把某个文件给 add 了 的解决方法

    1.我不小心把这两个文件给add 进来本地仓库 2.解决 进入指令框 ,执行 git rm --cached  文件名 如下图 注意,必须指定文件否则会删除所有

  9. Webstorm安装与配置

    一 下载 链接:https://pan.baidu.com/s/1gKxzGWvnoCpXPoe8zzfLnQ 提取码:5lyf 二 安装 https://www.jb51.net/softs/598 ...

  10. Python多线程、线程池及实际运用

    我们在写python爬虫的过程中,对于大量数据的抓取总是希望能获得更高的速度和效率,但由于网络请求的延迟.IO的限制,单线程的运行总是不能让人满意.因此有了多线程.异步协程等技术. 下面介绍一下pyt ...