【问题标题】:Flatlist not re-rendering when data is removed删除数据时不重新渲染平面列表
【发布时间】:2020-06-14 21:48:36
【问题描述】:

当数据从 sortedData 属性删除到平面列表时,我的 react-native 平面列表不会重新呈现。我尝试使用 extraData 道具强制重新渲染,但这没有用。当我删除元素时,会出现空白行。

handleRemove = (title) => {
    // const start = this.state.people.slice(0, index);
    // const end = this.state.people.slice(index + 1);
    // this.setState({
    //   people: start.concat(end),
    // });
    const filteredData = this.state.sortedData.filter(
      (item) => item.title !== title
    );
    this.setState({ sortedData: filteredData });
  };

  render() {
    const { sortedData } = this.state;

    return (
      <FlatList
        data={sortedData}
        keyExtractor={(item, index) => index.toString()}
        renderItem={({ item, index }) => (
          <LeaderboardEntry
            song={item}
            handler={this.handler}
            onRemove={() => this.handleRemove(item.title)}
          />
        )}
      />
    );
  }

【问题讨论】:

    标签: reactjs react-native react-native-flatlist


    【解决方案1】:

    你应该像下面那样做

     var newSortedData = [...this.state.sortedData];
        newSortedData.splice(index, 1);
        this.setState({
          sortedData: newSortedData,
        });
    

    原因是即使你正在更新状态,它指向同一个数组,所以你需要使用扩展运算符,它会创建一个新数组,这反过来会导致重新渲染。

    更新 使用过滤器删除项目 您的平面列表应更改为

    onRemove={() => this.handleRemove(item.title,index)}
    

    句柄移除函数的逻辑

    handleRemove = (title,index) => {
        const filteredData = this.state.sortedData.filter(
          (item,index) => item.index !== in
        );
        this.setState({ sortedData: filteredData });
      };
    

    这里根本不需要title参数,你也可以去掉它。

    【讨论】:

    • 感谢您的回答!不幸的是,它一次删除两个项目。知道为什么吗?
    • 我可以知道哪两个项目吗?喜欢它在您选择的索引旁边吗?
    • 您是否进行了任何代码更改?因为 splice 将删除从您提供的索引开始的 1 个项目,所以这应该可以工作
    • 我会将代码更新到新的代码库。我们现在遇到的错误是,当传入平面列表的数据数组时,会删除多个项目。
    • 这是一个完全不同的问题,您遇到的问题是过滤器逻辑,之前您是根据索引而不是根据您传递的标题删除的,如果两个或多个项目具有相同的标题,它们将被删除,您必须传递项目的 id 之类的内容并根据该 ID 删除
    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    相关资源
    最近更新 更多