博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一篇文章告诉你React里为什么不能用index作为key
阅读量:6231 次
发布时间:2019-06-22

本文共 1608 字,大约阅读时间需要 5 分钟。

文章首发于博客

之前在写react的时候,当我们做map循环的时候,当我们没有一个唯一id来标识每一项item的时候,我们可能会选择使用index

data.map((item, index) => {    return 
  • {item}
  • })复制代码

    但是其实当你使用index来作为唯一key的时候,其实是由一个大坑的,什么坑呢?必须坑了你才知道,来看下面的这种情况:

    class App extends React.Component{	constructor(props) {		super(props)		this.state = {			list: [{id: 1,val: 'aa'}, {id: 2, val: 'bb'}, {id: 3, val: 'cc'}]		}	}	click() {		this.state.list.reverse()		this.setState({})	}	splice() {		this.state.list.splice(1,1)		this.setState({})	}	render() {		return (            
      delete
      reverse
      { this.state.list.map(function(item, index) { return (
    • ) }.bind(this)) }
    ) }}class Li extends React.Component{ constructor(props) { super(props) } componentDidMount() { console.log('===mount===') } componentWillUpdate(nextProps, nextState) { console.log('===update====') } render() { return (
  • {this.props.val}
  • ) }}复制代码

    页面渲染好了之后,3个input输入框依次输入1,2,3: 当我们用index作为key的时候,点击reverse会发现,input输入框还是1,2,3顺序显示,但是这并不符合我们的预期,控制台中此时打印的也是update; 当我们用对象中的id作为key的时候,点击reverse,此时神奇的事情发生了,input输入框变成了3,2,1,符合我们的预期,控制台此时打印的也是update;

    为什么会这样呢?

    当我们传入index作为key时,此时的key为0,1,2, 当我们点击reverse重新排序后,index传进去的key还是0,1,2,此时react比较key=0时,发现只需要更新子节点的值就可以,于是只把item替换成了cc,而input则相反, 当我们传入id作为index的时候,,点击reverse后,此时的key变成了3,2,1,根据react的diff算法,react还是能分辨出只需要移动子节点即可完成更新,因此input也随之变化。

    那说了这么多,其实对于index作为key我们是不推荐的,除非你能够保证他们不会发生变化。

    参考文献 , 有问题可以在下方留言,感谢star

    转载地址:http://xyhna.baihongyu.com/

    你可能感兴趣的文章
    Android应用开发新路线
    查看>>
    smartHost 北京服务器
    查看>>
    制作自己的网络字体
    查看>>
    Xcode的包管理器:Alcatraz
    查看>>
    WinForms Adorner UI Manager v16.1支持高亮特定控件
    查看>>
    开源 免费 java CMS - FreeCMS1.2-功能说明-会员管理
    查看>>
    apache的mime.types作用
    查看>>
    语言的对于处理器的字长问题
    查看>>
    Virgo IDE Milestones
    查看>>
    查询数据库布局信息
    查看>>
    Android高手进阶(一)AIDL跨进程调用
    查看>>
    cocos2d-iphone之魔塔20层第八部分
    查看>>
    JSTL 核心标签库 使用
    查看>>
    安装Robot Framework-Mac
    查看>>
    mysql 多表 update sql语句总结
    查看>>
    Redhat 6 升级 openssl-1.0.2m 、openssh-7.6p1 和 ntp-4.2.8p10
    查看>>
    Spring-boot添加Mybatis
    查看>>
    一个早期前FB员工是如何搞砸了自己的工作,失去了1亿8千5百万美元
    查看>>
    在CentOS中安装flashplay插件
    查看>>
    flexpaper组件中关于隐藏真实的swf 地址下载
    查看>>