通过比较树中的元素是否在同一位置,通常已经足够判断是否是重用还是再次创建通信组件了。
但是这只在子元素的位置是静止的并且不需要重排。在我们的上述的例子中,即使message不存在,我们仍然只带input在message之后,并且没有其他的子元素。

对于动态列表,我们不能确定顺序是否会一致:

function ShoppingList({ list }) {return (<form>{list.map(item => (<p>You bought {item.name}<br />Enter how many do you want: <input /></p>))}</form>)
}

如果shopping项目没有被重排,React把所有的p和input元素看做是一个类型,并且不知道怎么移动他们。(从react的视角看,是商品的项目本身改变了,而不是他们的顺序)
React执行的10个商品项目的重排会是下面这样:

for (let i = 0; i < 10; i++) {let pNode = formNode.childNodes[i];let textNode = pNode.firstChild;textNode.textContent = 'You bought ' + items[i].name;
}

So instead of re-ordering them, React would effectively update each of them. This can create performance issues and possible bugs. For example, the content of the first input would stay reflected in first input after the sort — even though conceptually they might refer to different products in your shopping list!

This is why React nags you to specify a special property called key every time you include an array of elements in your output:

所以React会更新每一个元素而不是对他们进行重排。这可能会引起性能问题和可能的bugs。例如,当商品列表的顺序改变时,原本在第一个输入框的内容仍然会存在于现在的第一个输入框中 — 尽管事实上在商品列表里它应该代表着其他的商品!
这就是为什么React会提示你为每一个数组的遍历元素标记一个独有的key属性:

function ShoppingList({ list }) {return (<form>{list.map(item => (<p key={item.productId}>You bought {item.name}<br />Enter how many do you want: <input /></p>))}</form>)
}

key 给予 React 判断子元素是否真正相同的能力,即使在渲染前后它在父元素中的位置不是相同的。

当 React 在 <form> 中发现 <p key="42"> ,它就会检查之前版本中的 <form> 是否同样含有 <p key="42"> 。即使 <form> 中的子元素们改变位置后,这个方法同样有效。在渲染前后当 key 仍然相同时,React 会重用先前的宿主实例,然后重新排序其兄弟元素。

需要注意的是 key 只与特定的父亲 React 元素相关联,比如 <form> 。React 并不会去匹配父元素不同但 key 相同的子元素。(React 并没有惯用的支持对在不重新创建元素的情况下让宿主实例在不同的父元素之间移动。)

给 key 赋予什么值最好呢?最简单的答案就是:哪时候一个元素不会改变即使它在父元素中的顺序被改变? 例如,在商品列表中,商品本身的 ID 是区别于其他兄弟商品的标识。

React as a UI Runtime(五、列表)相关推荐

  1. React as a UI Runtime(四、条件)

    如果React在更新中只重用与元素类型相匹配的宿主实例,那按渲染条件选择的内容怎么办呢? 正如下面的代码,假如我们开始至需要一个input,但稍后需要在它之前渲染一个message : // 第一次渲 ...

  2. android ui 最新教程,Android更新UI的五种方式,androidui五种

    Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...

  3. React Native :加载新闻列表

    代码地址如下: http://www.demodashi.com/demo/13212.html 标签与内容页联动 上一节(React Native : 自定义视图)做到了点击标签自动移动,还差跟下面 ...

  4. React 最好的 ui 组件库集锦

    [转载]https://www.rails365.net/articles/react-zui-hao-de-ui-zu-jian-ku-ji-jin 这里有一篇讨论,说了哪个才是 React 最好的 ...

  5. react将表格动态生成视频列表【代码】【案例】

    只需要创建一个表格,id为videos,react就能将这个表格转换成视频列表,并点击自动播放 index.html <!DOCTYPE html> <html><hea ...

  6. Python.习题五 列表与元组(下)

    Python.<习题五> 列表与元组 11.假设列表lst_info=[["李玉","男",25],["金忠","男& ...

  7. [Android开发]Android更新UI的五种方式

    Android更新UI的五种方式: 1.handler.post 2.activity.runOnUiThread 3.view.post 4.handler+Thread 5.AsyncTask 下 ...

  8. 7 款最棒的 React 移动端 UI 组件库 - 特别针对国内使用场景推荐

    本文完整版:<7 款最棒的 React 移动端 UI 组件库 - 特别针对国内使用场景推荐> React 移动端 UI 组件库 1. Taro UI for React - 京东出品,多端 ...

  9. React主流开源UI库分析(附优质管理端模板)

    以下列举了一些React主流的开源UI库,希为某些所谓的大厂不要再重复造轮子,当然,确实有情怀笔者也为你点赞: 从Star及Fork数据来看,国内以Ant Design为主,国外以Material U ...

最新文章

  1. python matplotlib画图的几个实例--latex,坐标系等
  2. controller调用controller的方法_SpringCloud Alibaba微服务实战三 - 服务调用
  3. 【Groovy】Groovy 动态语言特性 ( Groovy 中函数实参自动类型推断 | 函数动态参数注意事项 )
  4. Windows下编程需要看哪些书
  5. fail-safe fail-fast知多少
  6. 【HDU - 6237】A Simple Stone Game(贪心,思维,素因子分解,数学)
  7. 【C/C++和指针】深度解析---指针与数组 【精华】
  8. 利用Cache缓存数据DataTable数据提高大数据量访问性能-.NET教程,数据库应用
  9. c fscanf 按行读取文件_每日干货丨C语言文件操作函数
  10. 配合Opencv2.4.9,CMake3.12.1和VS2010在win10下构建项目踩坑记录
  11. mmh学长的实验器材
  12. Redis 分布式客户端 Redisson 分布式锁快速入门
  13. 递归算法和经典递归例子
  14. 汇编软件DOSBox使用教程
  15. 中兴B860AV2.1-A,M,T-当贝纯净桌面-线刷固件(附刷机教程)
  16. 微信小程序开发部署发布可以在10分钟内完成
  17. CrystalQuartz实现Quartz的window服务的远程管理
  18. 云栖大会放大招,浪潮的JDM模式别人学不会
  19. 第七章 绘制3D图表和统计地图
  20. 利用requests库抓取猫眼电影排行

热门文章

  1. struts2登录注册示例_Struts 2控制标签示例教程
  2. java匿名类_Java匿名类
  3. apple_Apple WWDC 2018主题总结
  4. spring boot示例_Spring Boot REST示例
  5. java clock计时_Java Clock类– java.time.Clock
  6. junit5和junit4_JUnit声明异常– JUnit 5和JUnit 4
  7. css3常用技巧_您可能错过的5个CSS3技巧和窍门
  8. pluto.ctl_Apache Pluto,Portlet Bridge和JSF 2.0集成示例教程
  9. json 例子_json-简单的例子
  10. 开课吧Java课堂:多线程如何同步?消息如何传递?