Реализация счетчика в плоском списке React Native

#reactjs #react-native

#reactjs #react-native

Вопрос:

Предыстория

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

              <FlatList
                    style={selected ? styles.visible : styles.hidden}
                    data={data}
                    renderItem={({ item }) => (
                        <View style={styles.container}>
                            <View style={styles.left}>
                                <Text style={styles.title}>{item.name}</Text>
                                <Text style={styles.description}>{item.description}</Text>
                                <Text style={styles.price}>${item.price}</Text>
                                <View style={styles.adder}>
                                    <TouchableOpacity onPress={() => setCount(count - 1)}>
                                        <Text style={styles.less}>-</Text>
                                    </TouchableOpacity>
                                    <Text style={styles.counter}>{count}</Text>
                                    <TouchableOpacity onPress={() => setCount(count   1)}>
                                        <Text style={styles.more}> </Text>
                                    </TouchableOpacity>
                                </View>
                            </View>
                            <Image style={styles.right} source={{uri: item.image}}/>
                        </View>
                    )}
                />
 

Проблема

Как вы можете видеть, для каждого элемента есть счетчик, который пользователь может использовать, чтобы выбрать, сколько единиц продукта они хотят купить. Состояние обновляется следующим образом: const [count, setCount] = useState(0); как вы можете видеть, этот способ реализации счетчика означает, что добавление одной единицы любого продукта добавляет единицу каждого продукта.

Что я пробовал

Я видел, как некоторые люди делают это: setCount({counterA: 0, counterB: 0, etc.}) и обновляют каждый счетчик, однако, поскольку количество продуктов в документе firebase постоянно меняется, я не могу жестко указать количество счетчиков, которые мне нужны.

Вопрос

Как я могу отредактировать свой код, чтобы он влиял только на нужный элемент?

Ответ №1:

Элемент в вашей renderItem функции должен быть отдельным компонентом. В этом отдельном компоненте у вас будет a count , область действия которого ограничена только компонентом. Поэтому, когда кнопка нажата на этом компоненте, увеличивается только его счетчик, а не остальные. Проблема сейчас в том, что у вас есть один счетчик, который находится в родительском компоненте. После создания этого нового компонента «подсчета» ваш плоский список будет выглядеть примерно так:

                 <FlatList
                    style={selected ? styles.visible : styles.hidden}
                    data={data}
                    renderItem={({ item }) => (
                        <CountingComponent />
                    )}
                />
 

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

1. О, хорошо, я об этом не подумал, но это кажется разумным решением. Мне было интересно, может ли быть решение с точки зрения управления состоянием, но это будет работать просто отлично. Большое спасибо!