【问题标题】:How to remove a item/index from a FlatList in react native?如何在本机反应中从 FlatList 中删除项目/索引?
【发布时间】:2019-05-20 04:37:50
【问题描述】:

我有一个呈现为视图的数据,遇到了一个关于如何删除被刷过的特定索引的问题

我使用 FlatList 如下

render() {
this.leftOpenValue =  Dimensions.get('window').width;
this.rightOpenValue = -Dimensions.get('window').width;

return (   

     <FlatList 
            data = {data}  
            keyExtractor = {data => data.id}                
            renderItem={ ({item}) => (

                <View style={styles.container}>
                    <SwipeView            
                        disableSwipeToRight = {false}
                        renderVisibleContent={() => 
                            <View>
                                <Text style={styles.text}> {item.title} </Text>     // This repeats 9 times (9 Index)              
                            </View>          
                        }
                        renderRightView={() => (
                            <View style={{flex:1, justifyContent: 'flex-end', alignItems: 'center', backgroundColor: 'red'}}>

                            </View>
                        )}

                        leftOpenValue = {this.leftOpenValue}
                        rightOpenValue = {this.rightOpenValue}
                        onSwipedLeft={() => alert("deleted")}
                        swipeDuration = {300}
                        swipeToOpenPercent = {40}
                        disableSwipeToRight = {true}
                    />
                </View>  

            )}
    />
);

我已经使用 Swipeview 滑动(react-native-swipeview)并删除 flatlist 中的索引

我有一个关于如何从 flatList 中删除项目的问题

【问题讨论】:

  • 您编写了哪些代码来尝试删除列表/数据的项目?一般模式是将唯一可识别的 ID(键、索引等)传递给您的删除项目回调,并根据 等于该键的值过滤您的数据。这将返回一个没有该条目的新数组,并且您希望将其存储回您的状态。

标签: javascript react-native


【解决方案1】:

做一个正常的对象删除然后过滤你的状态来清理它

 let _rem = this.state.data;
 delete  _rem[index_no];
 this.setState({data: this.state.data.filter(args=>args!==index_no)});

【讨论】:

    【解决方案2】:

    一般模式是将唯一可识别的id(键、索引等)传递给您的删除处理程序,并根据不等于该键的值过滤您的数据。这将返回一个没有该条目的新数组以存储在状态中。

    deleteItemById = id => {
      const filteredData = this.state.data.filter(item => item.id !== id);
      this.setState({ data: filteredData });
    }
    
    render() {
      ...
    
      return (   
        <FlatList 
          data={data} // Assuming this is `this.state.data`
          keyExtractor={({item}) => item.id}                
          renderItem={({item}) => (
            <View style={styles.container}>
              <SwipeView
                ...
                onSwipedLeft={() => this.deleteItemById(item.id)}
                ...
              />
            </View>  
          )}
        />
      );
    }
    

    使用咖喱处理程序。这通过将回调设置为事件处理程序并在函数范围内包含id 来节省使用匿名回调。

    deleteItemById = id => () => {
      const filteredData = this.state.data.filter(item => item.id !== id);
      this.setState({ data: filteredData });
    }
    
    render() {
      ...
    
      return (   
        <FlatList 
          data={data} // Assuming this is `this.state.data`
          keyExtractor={({item}) => item.id}                
          renderItem={({item}) => (
            <View style={styles.container}>
              <SwipeView
                ...
                onSwipedLeft={this.deleteItemById(item.id)}
                ...
              />
            </View>  
          )}
        />
      );
    }
    

    【讨论】:

    • 有没有比使用 .filter() 对整个列表进行排序直到找到要删除的项目更快的替代方法?
    • @iamfrank 您可以传递一个索引并将其切片,但由于您仍然需要返回一个新数组(与其他元素),时间复杂度仍然相同,即从数组 and 返回一个新的数组引用是一个 O(n) 操作。上面我们并没有真正使用过滤器来“找到”元素,我们使用它主要是为了返回一个新数组。
    【解决方案3】:

    将项目的 Id 传递给 onSwipeLeft={this.deleteItem(item.id)} 并使用 setState 更新数据。

    state = {
        data: [{
          title: 'Hello world',
          id: 'hello'
        },{
          title: 'World says hello',
          id: 'say'
        }]
    }
    
    deleteItem = (id) => {
    
       this.setState({
        data: this.state.data.filter(item => item.id !== id)
       })
    
    }
    

    【讨论】:

    • 嘿,谢谢,这对我来说很好用,我还有一个问题,你可以检查this问题吗?
    猜你喜欢
    • 2020-03-25
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多