Вызов модального окна для списка продуктов открывает модальное окно для всех из них, а не только для того, по которому щелкнули.

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

Я использую useEffect для загрузки данных при загрузке страницы, а затем отображаю результаты:

 const fetchData = async () => {
    const categories = db.collection("productsDB");
    const collections = await categories
      .limit(6)
      .onSnapshot((querySnapshot) => {
        const items = [];

        querySnapshot.forEach((documentSnapshot) => {
          items.push({
            ...documentSnapshot.data(),
            key: documentSnapshot.id,
          });
        });

        setItems(items);
        setLoading(false);
      });

    return () => collections();
  };

  useEffect(() => {
    fetchData();
  }, []);

и показать их так:

{loading ? (
              <ActivityIndicator />
            ) : (
              items.map((item) => (
                <TouchableOpacity
                  style={styles.queryResult}
                  key={item.key}
                  onPress={() => {
                    setModalVisible(!modalVisible);
                  }}
                >
                  <View style={styles.queryResultContent}>
                    <Image
                      style={{ width: 100, height: 100 }}
                      source={{ uri: String(item.images) }}
                    />

                    <View>
                      <Text style={styles.queryInfoHeader}>{item.name}</Text>
                    </View>
                  </View>
                  <View>
                    <ProductModal
                      isModalVisible={modalVisible}
                      setModalVisible={setModalVisible}
                      navigation={navigation}
                      {...item}
                    />
                  </View>
                </TouchableOpacity>
              ))
            )}

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

есть ли лучший способ написать эту функцию?


person S. N    schedule 05.01.2021    source источник


Ответы (1)


Вы используете один и тот же флаг modalVisible для всех своих модальных окон; следовательно, они либо все видны, либо все скрыты.

Почему бы не иметь одно модальное окно вместо того, чтобы отображать их кучу в цикле и передавать элемент в качестве реквизита?

person Kai    schedule 05.01.2021
comment
на самом деле это была идея, есть только один модальный, но флаг одинаков для всех элементов, поэтому, когда я нажимаю на один из них, он открывает их все, но это только один модальный компонент, который я вызываю, как ты сказал, и я я пытаюсь передать элемент в качестве опоры для него. - person S. N; 06.01.2021
comment
Прямо сейчас у вас есть n модальные окна, потому что они рендерятся в цикле. - person Kai; 06.01.2021
comment
спасибо я исправил. - person S. N; 06.01.2021