KEYS

当你渲染列表中的项目(item)时,React总会储存各个项目(item)的相关信息。如果你渲染一个有状态(state)的组件,React需要储存状态。不论你如何实现你的组件,React总会存储对 the backing native views 的引用。
//React stores a reference to the backing native views.(fixme)

当你更新列表的时候,React需要判断到底是哪些内容被更新:你可能添加、删除、重排列,或者更新了项目(item)。

比如,从这样:

code

<li>Alexa: 7 tasks left</li>
<li>Ben: 5 tasks left</li>

变成这样:

code

<li>Ben: 9 tasks left</li>
<li>Claudia: 8 tasks left</li>
<li>Alexa: 5 tasks left</li>

在人眼看来,这只不过就是把Alexa和Ben调换了下位置,又加上了Claudia。但React只是个程序,它不懂你想要怎么干。因而,React要求,必须为列表中的每个元素都指定一个key属性,即一个字符串,用来区分各个组件。在本案例中,alexaben,claudia就可以是很合适的key。如果项目(item)对应于数据库中的对象,那数据库ID通常也是一个好的选择:

code

<li key={user.id}>{user.name}: {user.taskCount} tasks left</li>

key是React保留的特殊属性(和ref一样,那个更高级)。当元素被创建,React拉取key属性,并将其直接储存到返回的元素上。尽管它看起来像是props的一部分,但其实并不能通过this.props.key来引用。在判断哪个子组件应该被更新时,React自动使用key。组件自己是没办法查询自己的key的。

当列表被重新渲染,React会在新的版本提取每个元素,寻找里面有没有能和之前列表相匹配上的key。当一个key被添加到集合中时,一个组件实例会被创建;当一个key被删除时,一个组件实例会被销毁。React通过key来识别每个组件的身份,组件由此得以在重新渲染的过程中保持状态(state)。如果改变了组件的key,则该组件实例将被销毁,再重创建一个新的组件实例。这样,原来的状态无法继承,而是创建新的状态。

我们强烈建议,只要你建立动态列表,你应该设置合适的key。如果你没有合适的key,或许你该考虑一下重构你的数据,来得到合适的key。

如果你没有指定任何key,React将会发出警告,并回头使用数组的index作为key。但这么干也是不对的,因为当你重新排列表单中的元素,或者增/删 非列表底部的项目时,就会出问题。明确地传入key={i}虽然会让警告消失,但还是存在相同的问题。所以,大多数情况下,我们也不推荐这么做。

组件的key不需要再全局环境下保持唯一,只需要在(直接的?)兄弟组件间保持唯一就可以了。(fixme:immediate siblings.)

results matching ""

    No results matching ""