我最近一直在使用ReactJS但是当谈到" key"财产我真的不知道它是如何运作的。
在父组件中说我做的渲染如下:
render: function() {
// dataList = [{id: 1}, {id: 2}, {id: 3}]; => initial state
// dataList = [{id: 2}, {id: 3}, {id: 4}]; => second dataList state
var someComponentList = [];
this.state.dataList.forEach(function(data) {
someComponentList.push(
<SomeComponent key={data.id} id={data.id}/>
)
})
return (
<div>
{someComponentList}
</div>
)
}
在SomeComponent中:
var SomeComponent = React.createClass({
render : function({
// Render work here
}),
componentWillReceiveProps: function(nextProps) {
console.log(this.props.id == nextProps.id);
}
})
所以在componentWillReceiveProps
我希望3 false
个控制台结果(如果我在key
之后没有<SomeComponent>
属性,我会这样做setState()
但实际上我只有一个假,因为ReactJs似乎知道{id: 2}
&amp; {id: 3}
即使在dataList
州
我找到了一些关于Reactjs官方的简短文档:
当React协调键控子项时,它将确保任何具有键的子项将被重新排序(而不是被破坏)或被销毁(而不是重用)。
有人可以解释它是如何运作的吗?
答案 0 :(得分:5)
https://facebook.github.io/react/docs/reconciliation.html#keys
如果指定密钥,React现在可以找到插入,删除, 替换并使用哈希表在O(n)中移动。
它只是一个简单的哈希表(兄弟姐妹)查找,并使React尝试重用具有相同密钥的组件。
粗略解释,
没有钥匙:
[1] [2] [3]
[2] [3] [4]
list-wise diff,[updateAttributes x3]
用键:
[1] [2] [3]无
零[2] [3] [4]
[2] [3] [4],[2]的列表与[2]的密钥匹配没有变化,[3]有密钥... [3]没有变化,[4]没有密钥,没有更多的节点原始列表如此插入,[1]将被销毁