关于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)的简单解释?尽量别用那么正式的定义,用尽可能简单的数学 ...
随机推荐
- 「双串最长公共子串」SP1811 LCS - Longest Common Substring
知识点: SAM,SA,单调栈,Hash 原题面 Luogu 来自 poj 的双倍经验 简述 给定两字符串 \(S_1, S_2\),求它们的最长公共子串长度. \(|S_1|,|S_2|\le 2. ...
- 台湾旺玖MA8601|USB HUB方案|MA8601测试版
MA8601是USB 2.0高速4端口集线器控制器的高性能解决方案,完全符合通用串行总线规范2.0.MA8601继承了先进的串行接口技术,当4个DS(下游)端口同时工作时,功耗最低. MA8601采用 ...
- 【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式
背景: 在做前后端分离时,牵扯到跨域,但是已经设置了跨域 前端设置了允许携带Cookie axios.defaults.withCredentials = true; 后端也配置了跨域 浏览器端查看发 ...
- docker——nginx运行起不来或者说起来了又挂了
记得刚开始玩docker的时候,想着docker上运行一个nginx代理,于是写了个Dockerfile: FROM nginx:latest WORKDIR . COPY demo.conf /et ...
- 我踩过的python的坑
1. string中Template用法 变量名不能是${tradeDate+1}, python无法识别其为变量,应改为 ${tradeDate1} 变量替换的语句:data_new = Templ ...
- 初识python 之 MongoDB 基本操作
MongoDB与SQL对比: MongoDB 三元素:数据库.集合.文档 MongoDB 基本操作命令: db 查看当前数据库 show dbs 查看所有数据库 use 数据库名 切换数据库,如果数据 ...
- RabbitMQ --- 直连交换机 【 无回调方法,不能获取消费结果 】
1.前言 消息队列除了kafka 外,还有许多种,比如RabbitMQ .ActiveMQ.ZeroMQ.JMQ等. 老牌的ActiveMQ ,底层使用Java写的,资源消耗大,速度也慢,但是适合 J ...
- Hive实现网站PV分析
原文链接: https://www.toutiao.com/i6773241257528394248/ 之前我们做过<java mapreduce实现网站PV分析>,这次我们可以用hive ...
- 使用.NET 6开发TodoList应用(27)——实现API的Swagger文档化
系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在日常开发中,我们需要给前端提供文档化的API接口定义,甚至需要模拟架设一个fake服务用来调试接口字段.或者对于后端开发人员 ...
- react中引入图片路劲正确但是页面上不显示或者打包后不能正常显示的问题
一.react中图片引入方式 以前我们用img引入图片只需要如下即可,在react中这样写会报错: <img src="../assets/zzsc1.png" /> ...