关于diffing算法中key的使用
在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的使用的更多相关文章
- 七天接手react项目 —— 生命周期&受控和非受控组件&Dom 元素&Diffing 算法
生命周期&受控和非受控组件&Dom 元素&Diffing 算法 生命周期 首先回忆一下 vue 中的生命周期: vue 对外提供了生命周期的钩子函数,允许我们在 vue 的各个 ...
- redis中key的过期键删除策略
Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...
- 天气预报接口:SmartWeather API中key的计算方法
这个代码大家都蛮感兴趣,我在git开源了一个用于收集天气信息的系统,基于python语言的,请大家参考: https://github.com/BerlinSun/WeatherForecast -- ...
- 直接操作DOM一定比虚拟DOM操作耗时,diff算法,key值,虚拟 DOM的定义
直接操作DOM一定比虚拟DOM操作耗时吗? 或者一次直接DOM操作一定比一次虚拟DOM操作耗时吗? 1)虚拟DOM的本质就是一个JS对象,虚拟DOM减少了真实DOM的操作,当修改数据的时候,就是修改虚 ...
- React中key的讲解
通过阅读React的文档我们知道React这个框架的核心思想是,将页面分割成一个个组件,一个组件还可能嵌套更小的组件,每个组件有自己的数据(属性/状态);当某个组件的数据发生变化时,更新该组件部分的视 ...
- v-for中key的作用与原理
一.虚拟DOM中key的作用 key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据新数据生成新的虚拟DOM,随后Vue会对新虚拟DOM与旧虚拟DOM的差异进行比较. 二.如何选择key 最好使 ...
- KMP算法中next函数的理解
首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ...
- STL源码中map和set中key值不能修改的实现
前言 最近正好刚刚看完,<stl源码剖析>这本书的map和set的源码部分.但是看完之后又突然发现,之前怎么没有注意到map和set容器中key不能修改是怎么实现的.故,特此整理如下. s ...
- 简明解释算法中的大O符号
伯乐在线导读:2009年1月28日Arec Barrwin在StackOverflow上提问,“有没有关于大O符号(Big O notation)的简单解释?尽量别用那么正式的定义,用尽可能简单的数学 ...
随机推荐
- 第五十一个知识点:什么是基于ID的加密的安全模型,然后描述一个IBE方案
第五十一个知识点:什么是基于ID的加密的安全模型,然后描述一个IBE方案 在公钥密码学中,如果Alice想要给Bob发送一条消息,她需要Bob的公钥,一般来说公钥都很长,就像一个随机的字符串. 假设A ...
- GPT and BERT
目录 概 主要内容 GPT BERT Radford A., Narasimhan K., Salimans T. and Sutskever I. Improving language unders ...
- Improving Variational Auto-Encoders using Householder Flow
目录 概 主要内容 代码 Tomczak J. and Welling M. Improving Variational Auto-Encoders using Householder Flow. N ...
- IM2603 Type-C扩展坞电源管理 IC
IM2603 概述 用于带有集成降压转换器的 Type-C 外围应用的电源管理 IC IM2603 是一款主要用于 Type-C 外围应用的电源管理 IC. 它集成了一个带有内置高侧 MOSFET 的 ...
- 编写Java程序_输入三个整数x,y,z,请把这三个数由小到大输出,请写出实现代码。(3种方法)
要求说明: 输入三个整数x,y,z,请把这三个数由小到大输出. 实现代码: 第1种方法: import java.util.Scanner; public class xyzMaxMin{ publi ...
- What's new in dubbo-go-pixiu 0.4.0
Dubbo-go-pixiu 是一款高性能 API 网关,支持 Dubbo 和 Http 等多种协议.具体介绍文章可以参考<Dubbo 跨语言调用神兽:dubbo-go-pixiu>. 近 ...
- mysql总结笔记 -- 索引篇
索引的作用 索引是用来高效的获取数据的 排好序 的 数据结构,如果没有索引,可能会导致查询某一条记录的时候遍历整张表:所以适当的索引可以大大的提升检索速度: 索引的数据结构 二叉树 假如说我们有一列数 ...
- svn创建多个版本库
mkdir /pangbing cd /pangbing/ svnadmin create 1 svnadmin create 2 svnadmin create3 启动时候这样启动 svnserve ...
- spring boot + spring security +JWT令牌 +前后端分离--- 心得
1.前言 观看这篇随笔需要有spring security基础. 心得: 1.生成token 的变化数据是用户名和权限拼接的字符串 ,其他的固定 2.生成的token是将登录通过的用户的权限拼接的字符 ...
- spring security +MySQL + BCryptPasswordEncoder 单向加密验证 + 权限拦截 --- 心得
1.前言 前面学习了 security的登录与登出 , 但是用户信息 是 application 配置 或内存直接注入进去的 ,不具有实用性,实际上的使用还需要权限管理,有些 访问接口需要某些权限才可 ...