我的 FlatList 似乎不需要 keyExtractor——为什么?

My FlatList does not seem to need a keyExtractor -- why?

我的 FlatList 似乎不需要任何 keyExtractor。如果我不提供任何 keyExtractor,它就可以工作。如果我提供一个带有垃圾代码的 keyExtractor,它也可以工作。

如果我没有看到任何错误,是否意味着放弃 keyExtractor 是安全的?我什么时候需要一个?

_renderItem = ({item}) => (
  <Text style={styles.item}>
    {item.name[0].value}
  </Text>
)

然后在我的 render() 中,除此之外我还有...

<FlatList style = {styles.flatlist}
 data={this.state.data}
 renderItem={this._renderItem}
/>

下次做项目时,模拟器中开始出现警告(黄框)。所以keyExtractor确实是必须的,只是warning没有马上出现。

这就是我的警告消失的原因...

_keyExtractor = (item: { id: Array<any> }) => item.id[0].value;

以及项目...

_renderItem = ({item}) => (
    <Text key={item.id[0].value} style={styles.item}>
      {item.name[0].value}
    </Text>
  )

在我的渲染函数中...

<FlatList style = {styles.flatlist}
    data={this.state.data}
    keyExtractor={this._keyExtractor}
    renderItem={this._renderItem}
 />

根据 the React Docs,您需要 "for caching and as the react key to track item re-ordering" 的密钥提取器。您可以通过为每个项目显式定义一个键 属性 或在 FlatList 上指定一个 keyExtractor 道具来做到这一点。如果你两者都不做,那么它将默认使用索引并且仍然有效(尽管它仍然会发出警告)。

例如,假设我有名字 "Aaron"、"Betty"、"Charlie" 和 "Diane"。我可以执行以下任一操作来避免警告:

选项 1:每个项目的密钥 属性

<FlatList
  data={[
      {key: 'Aaron'},
      {key: 'Betty'},
      {key: 'Charlie'},
      {key: 'Diane'}
  ]}
  renderItem={({item}) => <SomeComponent />}
/>

选项 2:使用索引提供 keyExtractor

<FlatList
  data = [
    {name: 'Aaron'},
    {name: 'Betty'},
    {name: 'Charlie'},
    {name: 'Dave'}
  ]
renderItem={({item}) => <SomeComponent />
keyExtractor={(item, index) => index.toString()}
/>

选项 3:使用特定 属性

提供 keyExtractor

<FlatList
  data = [
    {name: 'Aaron'},
    {name: 'Betty'},
    {name: 'Charlie'},
    {name: 'Dave'}
  ]
renderItem={({item}) => <SomeComponent />
keyExtractor={(item, index) => item.name}
/>