выбор и удаление нескольких элементов из flatlist

#react-native #react-native-flatlist

#react-native #react-native-плоский список

Вопрос:

У меня есть плоский список, который выглядит следующим образом:

   <FlatList
    numColumns={3}
    scrollEnabled={false}
    data={dataset}
    keyExtractor={(item) => item.id}
    extraData={selectedId}
    renderItem={renderItem}
  />
 

пользователи могут выбрать 1 или более элементов, и если элемент уже выбран, он будет удален

Я могу добавить много элементов и удалить их тоже, однако проблема в том, что если я выбираю элемент, я не могу удалить его напрямую, мне нужно выбрать другой элемент, тогда ранее выбранный элемент будет удален.

но я не могу удалить его, если снова нажму на тот же элемент. Я должен выбрать другой элемент, тогда более старый элемент будет удален, а другой элемент будет добавлен.

мой элемент визуализации:

   const renderItem = ({ item }) => {
    return (
      <TouchableOpacity
        style={item.selected ? styles.setItemItemSlt : styles.setItemItem}
        onPress={() => [
          setSelectedId(item.id),
          onPressBtn({ item }, item.selected),
        ]}
      >
        <Image style={styles.setItemItemImage} source={item.icon} />
      </TouchableOpacity>
    );
  };
 

также:

   const [selectedId, setSelectedId] = useState(null);
 

и массив выглядит следующим образом:

     const [dataset, setItem] = useState([
        {
          id: 1,
          icon: require("../../src/assets/png/egg.png"),
          name: "egg",
          selected: false,
        },
        .
        .
        .
        .
        .
      ]);
 

и:

   const onPressBtn = ({ item }) => {
    // if it has been selected remove it
    if (item.selected) {
      item.selected = false;
    }
    // if it is not in the list add it
    else {
      item.selected = true;
    }
  };
 

как я могу исправить эту проблему?

Ответ №1:

Попробуйте этот способ, он удалит выделение, если оно уже выбрано

 // add index here
const renderItem = ({ item, index }) => {
    return (
      <TouchableOpacity
        .....
        onPress={() => [
          .....
          onPressBtn(item, index), // send index as param
        ]}
      >
        .........
      </TouchableOpacity>
    );
  };

const onPressBtn = (item, index ) => {
    const data = [...allergens];
    data[index].selected = !data[index].selected;
    allergy(data); // reset data here to state   
};
 

Комментарии:

1. спасибо, это сработало нормально, мне пришлось сбросить набор данных.