簡體   English   中英

在React Native中從FlatList中刪除項目無法正確呈現

[英]Removing items from a FlatList in React Native not rendering correctly

使用平面列表在React Native中遇到我的第一個問題

我的清單如下:

render() {
    this.state.loadItems.forEach(function(item, index) {
      item.id = index;
    });

    return (       
      <FlatList data={this.state.loadItems} extraData={this.state} renderItem={({item}) => this.renderLineItem(item)} keyExtractor={(item, index) => item.id}/>      
    );       
}

renderLineItem(item) {
  return <LoadListItem id={item.id} loadItem={item} configChanged={this.configHandler} itemRemoved={this.removeHandler}></LoadListItem>
}

在LoadListItem中,我有一個回調,該回調從狀態列表中刪除該項目,因為有一個彈出窗口可刪除LoadListItem,實現如下:

removeHandler(index) {    
    var newState = {};
    newState.loadItems = this.state.loadItems.slice(0);
    newState.loadItems.splice(index,1);

    this.setState(newState, this.updateParent);
  }

我正在使用ExtraData,使用slice等克隆數組,但對我而言,列表無法正確呈現。 使用調試器,我可以看到在設置狀態被調用之后,render和renderLineItem被新列表調用了……但是列表在視覺上刪除了錯誤的項。 例如,如果我有一個包含A,B,C,D的列表,並且刪除了CI,則可以看到狀態已更新為A,B,D ..我可以使用調試器在render方法中進行驗證,但該渲染直觀地顯示了A,B ,C..so刪除有效...但是項目錯誤。 如果單擊其他選項卡(從視圖中刪除列表),然后再次打開,它將自行修復。 因此狀態已正確更新...但是視圖刪除了錯誤的項目...任何想法? 干杯

這很可能是狀態不變性和/或索引問題。 通常,始終嘗試避免直接改變狀態(即,使用this.state.loadItems.forEach()設置ID)。 這是有關此主題的有用文章: https : //medium.com/pro-react/a-brief-talk-about-immutability-and-react-s-helpers-70919ab8ae7c

理想情況下,數據在創建時已經具有唯一的ID,但是當您必須自己添加它們時,請在通過api或componentDidMount()而不是render()初始化數據時進行添加。

createIdsForData = () => {
  // returns a new array with ids from index
  let dataWithIds = this.state.loadItems.map((item, index) => {
    item.id = index;
  });

  this.setState({
    loadItems: dataWithIds;
  });
}

由於在刪除/添加組件時索引可能有些變幻莫測,因此我還建議將LoadItem的ID傳遞給您的removeHandler而不是索引。

removeHandler = (id) => {
  // returns new array with item filtered out
  this.setState({
    loadItems: this.state.loadItems.filter(item => item.id === id);
  });
}

希望這會有所幫助,歡呼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM