react 对循环warning提示增加key的研究

在学习react遇到这个问题,页面可以正常工作,但控制台一直出现这个警告,看着很不爽,然后研究怎么解决。具体代码可以查看我的github:https://github.com/huanlifen/react-key-warning.git

  1. warning01/todo.html

代码片段:

var TodoList = React.createClass({
        render: function() {
            var createItem = function(itemText) {
                return <li key={itemText}>{itemText}</li>;
            };
            return <ul>{this.props.items.map(createItem)}</ul>;
        }
    });

Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method

在浏览器中打开后,点击“add #7”按钮会出现上面的警告,原因是数组循环时缺少unique "key" prop,意思就是要有一个不会重复的关键参数key。

2.warning02/todo.html

那么,关键参数重复了会怎样呢?

代码片段:

var TodoList = React.createClass({
        render: function() {
            var createItem = function(itemText) {
                return <li key={itemText}>{itemText}</li>;
            };
            return <ul>{this.props.items.map(createItem)}</ul>;
        }
    });

在浏览器中打开后,点击“add #7”按钮增加重复的对象,会出现:

Warning: flattenChildren(...): Encountered two children with the same key, .$1. Child keys must be unique; when two children share a key, only the first child will be used.

而且,添加不了重复的对象,不同的对象是可以添加的。

  1. warning/todo.html

由此,我们可以从表面上理解:在页面可以正常工作的前提下,这个key要么设置为会重复的关键参数,要么不设置。不设置,控制台会出警告,但不影响页面正常工作。完美的解决方法:就是消除警告,页面还可以正常工作。

改写TodoList ,增加key,reactid从0开始递增,前缀:li_,由此产生不重复的key值。

代码片段:

var TodoList = React.createClass({
        render: function() {
            var reactid = 0;
            var createItem = function(itemText) {
                return <li key={‘li_‘ + reactid++}>{itemText}</li>;
            };
            return <ul>{this.props.items.map(createItem)}</ul>;
        }
    });

在浏览器中打开后,没有警告,页面可以正常工作。

但是,这个key在传递数据的时候根本就没有用,设置了不是很多余吗?

有位网友在http://pandakeeper.net:8000/?p=254 中是这么说的:

react的key关乎到react的dom-diff算法 react中对于dom的操作是根据生成的data-reactid进行绑定的,添加key可以保证dom结构的完整性,而不会根据react自己对dom标记的key进行重新分配 react每次决定重新渲染的时候,几乎完全是根据data-reactid来决定的,最重要的是这个机制

dom-diff是指: 所有的 DOM 变动,都先在虚拟 DOM 上发生,然后再将实际发生变动的部分,反映在真实 DOM上。它可以极大提高网页的性能表现。

不过我还不是不明白:这个key在页面渲染的时候react组件用到了,但我们这些开发者根本就没有用,那为什么还要我们去设置呢,直接用默认的不就行了?

有答案的时候我会更新的,敬请期待。。。。

时间: 2024-07-28 14:18:57

react 对循环warning提示增加key的研究的相关文章

GitHub提示 Error: Key already in use解决办法

GitHub提示 Error: Key already in use解决办法GitHub提示 Error: Key already in use解决办法2014年09月05日 ? 综合 ? 共 290字    ? 字号 小 中 大 ? 评论关闭 出现这个的原因是你在以前也用过GitHub,并且提交了你的密钥,这个时候你可以通过在命令行里输入  ssh -T -i ~/.ssh/id_rsa [email protected]来查看到底是哪一个账户在使用此密钥,会出现如下提示 其中saymagic

WARNING: UNPROTECTED PRIVATE KEY FILE!WINDOWS下命令行秘钥无法连接centOS的问题

秘钥文件复制到其他目录后,命令行连接CentOS报错..复制后的文件用xshell可以连接 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: UNPROTECTED PRIVATE KEY FILE! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Permissions for '.\\XXX.pem' are too open.It

在react或vue中,for循环用Index作为key值是好还是坏呢?

React 与 vue的基本实现原理是通过对比两次虚拟dom的不同 然后直接操作不同的dom 当以数组的下标index作为key值时  其中一个元素发生了变化 就有可能导致所有元素的key值发生改变  diff算法是比较同级之间的不同  以key来进行关联  当对数组进行下标的变换时,比如删除第一条数据,那么以后所有的Index都会发生改变,那么key自然也跟着全部发生改变, 所以index作为key值是不稳定的,这种不稳定性有可能导致性能的浪费 导致diff无法关联起上一次一样的数据  因此

react antd Warning: must set key for &lt;rc-animate&gt; children

实例中,location 有可能是一个‘’,''.split() 将输出[""],是个含有空字符串的数组,而[]是个什么都没有的数组,两者不同.code:change initialValue from :initialValue: location.split(',') || []to:initialValue: location === '' ? [] : location.split(',') 原文地址:https://www.cnblogs.com/begin256/p/113

React后台管理系统-品类的增加、修改和查看

1.页面 2.品类列表展示 let listBody = this.state.list.map((category, index) => {             return (                 <tr key={index}>                     <td>{category.id}</td>                     <td>{category.name}</td>         

react的循环数组方法的使用

react循环数组有2种方法 法一:直接在所需的地方循环(推荐) <ul> {this.state.list2.map(function(value,key){ return(<li key={key}>{value}</li>) })} </ul> 法二: import React from 'react'; class News extends React.Component{ constructor(props){ super(props) this.

React中循环渲染类似Vue中 的v-for

17==>循环数组 类似v-for import React, { Component } from "react"; export default class CharShop extends Component { // state初始化一般写在构造器当中 constructor(props){ super(props); this.state={ goods: [ { id: 1, text: "web111" }, { id: 2, text: &qu

删除提示 FOREIGN KEY 约束引用”

有时想删除某个表时,提示“无法删除对象 'Orders',因为该对象正由一个 FOREIGN KEY 约束引用”,原因很简单不要急躁,它被其它表的外键引用了,所以无法删除,在此只需先找到哪些表的外键引用了该表的字段.通过系统函数就能解决(SQL Server系统函数提供了非常完善的功能,能代替我们查找和解决许多问题). select    fk.name,fk.object_id,OBJECT_NAME(fk.parent_object_id) as referenceTableNamefrom

python字典的循环是默认取key的

字典循环默认取key例子 dict={'name':'john','number':'201801','weight':'80kg','tall':'180cm"} #------直接循环字典默认取key------ for i in dict: print(i) #-----也可以循环key--------- for i in dict(keys): print(i) #------循环值--------------- for i in dict(values): print(i) 原文地址: