【问题标题】:VirtualizedList: missing keys for items - React NativeVirtualizedList:缺少项目的键 - React Native
【发布时间】:2019-12-05 13:21:41
【问题描述】:

在我的componentDidMount() 上,我进行了一个查询,我从 MongoDb 数据库中收到了一些我想在FlatList 中显示的文档。当我收到查询的结果时,我使用函数mapToList() 将它们映射到我的state.list。我在这里使用的list.id 是由MongoDb 本身生成的插入文档_id。只是有一个id 在这里工作。然后我将key={item.id} 添加到我的renderItem({item}) 方法中,但我仍然收到错误,我必须将密钥添加到我的VirtualizedList 或使用KeyExtractor。

我正在尝试使用SwipeoutFlatList 中删除一个项目,但首先我必须让这个id 工作。

export default class MyFlatList extends React.Component{
 state={   
 loading: false,
 list: [{
   name: '',
   subtitle: '',
   rightSubtitle: '',
   rightTitle: '',
   id: undefined
 }]
};

mapToList();

mapToList(result)
{ 
  const list = [];
  for(var i = 0; i<result.length; i++)
  {
      list[i] =  {name: result[i].name,
      subtitle : result[i].projectname,
      rightTitle : result[i].work,
      rightSubtitle : result[i].date,
      id: result[i]._id
    };
  }
  this.setState({list});
}

渲染()

  render(){
  return(
    <View>
    <FlatList
      data={this.state.list}
      renderItem={this.renderItem}
      />
      <ActivityIndicator animating={this.state.loading} color="black" size="large"/>
    </View>
        )
  }

renderItem({item})

renderItem = ({item}) => (
  <Swipeout right={swipeoutBtns}>
  <ListItem
    title={item.name}
    key={item.id}
    titleStyle={styles.titleText}
    subtitleStyle={styles.subtitleText}
    rightTitleStyle={styles.rightSubtitleText}
    rightSubtitleStyle={styles.rightSubtitleText}
    rightIcon={
      <Icon name="keyboard-arrow-right"
          size={17}
          color="black"
        />}
    subtitle={item.subtitle}
    rightTitle={item.rightTitle}
    rightSubtitle={item.rightSubtitle}
    leftAvatar={{rounded:false, title:'PS'}}
  />
  </Swipeout>
)

【问题讨论】:

    标签: javascript react-native react-native-flatlist react-native-listview


    【解决方案1】:

    您需要keyExtractor 参数。默认情况下,它会检查该项目是否具有 key 属性,而这并不是您收到此警告的原因。

    用于在指定索引处为给定项目提取唯一键。 Key 用于缓存和作为响应键来跟踪项目重新排序。默认提取器检查 item.key,然后像 React 一样回退到使用索引。

    这样做:

     _keyExtractor = (item, index) => item.id.toString();
    
    <FlatList
       data={this.state.list}
       renderItem={this.renderItem}
       keyExtractor={this._keyExtractor}
     />
    

    【讨论】:

    • 这是正确的,但输入item.id.toString(),因为键需要是字符串
    • @fayeed @crodev 我试过这个,但它仍然给我同样的错误。我在renderItem({item}) 方法中为每个ListItem 指定了一个key={item.id}。这和KeyExtractor 方法有什么区别?
    • 我不太清楚其中的区别,但有时当我使用平面列表时,keyExtractor 有效,但 key 没有
    • FlatList 默认检查项目是否具有key 属性,如果是,则分配它,否则将使用项目的索引。 keyExtractor 用于覆盖默认行为,因为键是您的 id 属性。至于您在renderItem 期间手动分配key 属性的情况,它会被默认的keyExtractor 函数覆盖。
    • 当我从ListItem 中删除key 并使用keyExtractor 时,它起作用了!
    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2020-02-03
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多