React 等框架使用 index 做 key 的问题
React 等框架使用 index 做 key 的问题
假如有两个树,一个是之前,一个是更变之后,我们抽象成两种可能性。
- 插入内容在最后
- 插入内容在最前
关于插在中间,原理一样,就不阐述。
使用 ul 代表树,并且使用了 index 做 key:
<ul>
<li key="{0}">00000</li>
<li key="{1}">11111</li>
</ul>
先说原理
diff 树的时候,是一句一句往下的,所以是:ul -> li -> li -> ... 这样的过程,注意是对比。
插在最后
则变成这样:
<ul>
<li key="{0}">00000</li>
<li key="{1}">11111</li>
<li key="{2}">22222</li>
</ul>
对比原来的,是这样的场景:
- ul 一样,不用重新搞
- li 的 key 是 0,一样,不用重新搞
- li 的 key 是 1,一样,不用重新搞
- 恩,多了一个 li,key 是 2,加上去
简单理解来说,可以当做做了一步。
插在最前面
则应该变成这样:
<ul>
<li key="{0}">22222</li>
<li key="{1}">00000</li>
<li key="{2}">11111</li>
</ul>
对比原来的,是这样的场景:
- ul 一样,不用重新搞
- li 的 key 是 0,一样,不用重新搞
- li 的 key 是 1,一样,不用重新搞
- 恩,多了一个 li,key 是 2,加上去
最后就可能出现这样的结果:
<ul>
<li key="{0}">00000</li>
<li key="{1}">11111</li>
<li key="{2}">11111</li>
</ul>
差不多就这个意思,所以还是使用独立标记,比如:id 这种靠谱。
React 等框架使用 index 做 key 的问题的更多相关文章
- v-for为什么要加key,能用index作为key么
前言 在vue中使用v-for时,一直有几个疑问: v-for为什么要加key 为什么有时候用index作为key会出错 带着这个疑问,结合各种博客和源码,终于有了点眉目. virtual dom 要 ...
- UmiJS可插拔的企业级 react 应用框架,配合ant-design-pro使用
入门非常简单 # 安装 $ yarn global add umi # 或者 npm install -g umi # 新建应用 $ mkdir myapp && cd myapp # ...
- React Native框架如何白盒测试-HIPPY接口测试架构篇
本文转载自腾讯TMQ团队 ,侵权删. 1.开天辟地 Hippy是什么呢?简单点,能用JavaScript来写Android和iOS应用的框架, 类似业界的React Native. 好吧,我们还是严谨 ...
- react实战 : 用矩阵思想做一个自适应布局容器组件
需求是这样的. 有一个需要显示若干方块型元素的小区域 数量比较少的时候显示一排 数量比较多的时候显示两排 用 grid 不好,因为当数量为奇数的时候需要两排里面的元素都乖乖的居中显示. 用 flex ...
- 13个精选的React JS框架
如果你正在使用 React.js 或 React Native 创建用户界面,可以试一试本文推荐的这些框架. React.js 和 React Native 是流行的用户界面(UI)开发平台,且都是开 ...
- (转)PowerDesigner提示Existence of index、key、reference错误
建立一个表后,为何检测出现Existence of index的警告 A table should contain at least one column, one index, one key ...
- PowerDesigner 提示 Existence of index、key、reference错误
一.建立一个表后,为何检测出现Existence of index的警告 A table should contain at least one column, one index, one key, ...
- INDEX && PRIMARY KEY && UNIQUE KEY
When I have do some sql tody, some confusion come up to me. Its about the index && PRIMARY K ...
- Unity3D研究之多语言用中文做KEY
做多语言的时候用中文做KEY绝对是有100%的优点,假设用英文表示那么代码里面给文字赋值的地方全都是英文.写的代码多了以后维护起来就没有人能看懂了,或者看起来非常费劲. 对PoolManager ...
随机推荐
- vue axios 与 FormData 结合 提交文件 上传文件
---再利用Vue.axios.FormData做上传文件时,遇到一个问题,后台虽然接收到请求,但是将文件类型识别成了字符串,所以,web端一直报500,结果是自己大意了. 1.因为使用了new F ...
- (其他)最常用的15大Eclipse开发快捷键技巧
转自CSDNJava我人生(陈磊兴) 原文出处 引言 做java开发的,经常会用Eclipse或者MyEclise集成开发环境,一些实用的Eclipse快捷键和使用技巧,可以在平常开发中节约出很多 ...
- 【转】解决weblogic启动慢和创建域慢的方法
创建域慢启动慢的特征:创建域到70%时,进程长时间等待(命令行创建时停止在100%处),创建域启动Weblogic的时候也是长时间停止. Weblogic在Linux下启动慢的原因,发现从进程堆来看, ...
- [MapReduce_4] MapTask 并发数的决定机制
0. 说明 介绍 && Map 个数 & Reduce 个数指定 && Map 切片计算 1. 介绍 一个 job 的 Map 阶段并行度由客户端在提交 job ...
- Python基础知识:函数
1.定义函数和调用函数 #定义函数def def greet_user(username): '''简单的问候语''' print('Hello,%s!'%username) greet_user(' ...
- asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFactory,DALMsSql'.
asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFa ...
- postMessage 实现跨源通信 iframe 跨域获取url
用postMessage实现跨源通信的方法实例 如:在www.bbb.com/index.html页面获取www.aaa.com/index.html的数据,以iframe的形式 www.aaa.co ...
- c++引用lib和dll的方法总结
C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1 LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add F ...
- 用requests爬取一个招聘网站
import requestsimport re session = requests.session()第一步:访问登陆页,拿到X_Anti_Forge_Token,X_Anti_Forge_Cod ...
- UVA10562-Undraw the Trees(递归)
Problem UVA10562-Undraw the Trees Accept: 1199 Submit: 8397 Time Limit: 3000 mSec Problem Descripti ...