React Native onPress вызывается для каждого компонента, отображаемого с помощью mapping json

#javascript #json #reactjs #react-native

#javascript #json #reactjs #react-native

Вопрос:

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

Ситуация:

У меня есть объект json, и я хочу отобразить значения в нем, поэтому я сопоставил значения и отобразил их в компоненте. Мне нужно вызвать этот компонент только один раз, и он отобразит себя несколько раз в зависимости от того, сколько объектов находится в моем объекте json.

Теперь, когда я запускаю функцию onPress для одного конкретного отображаемого экземпляра, она будет запускаться для каждого отображаемого экземпляра.

Желаемая ситуация:

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

Код:

Я выполняю запрос get, и ответ возвращает объект json:

 {
"objects": [
    {
        "name": "Alarm chauffeurs@ON=100",
        "object_id": 1,
        "input_value": 0,
        "last_changed": "2019-03-08T14:30:54",
    }, ...
  

Затем я сопоставляю значения своему компоненту:

       let cards = this.state.dataSource.objects.map((val, key) => {
      return (
         <Animated.View key={key} style={[cardStyle.container, { height: this.state.collapse[parseInt(val.object_id)] }]}>
            <TouchableHighlight onPress={() => this.toggle(val.object_id)} />
         </Animated.View>
      );
      });
  

Теперь мне нужно вызвать {cards} в моем MainView только один раз, и React Native отобразит несколько карточек:

       return (
         <View style={style.container}>
            <View style={style.colDash}>
               <ScrollView>
                  {cards}
               </ScrollView>
            </View>
        </View>
      );
  

Вот изображение выходных данных

Теперь, как только я нажимаю кнопку, onPress запускается для каждого компонента на экране.

Я пытался:

Создал массив и вставил в него случайное значение, которое id всегда начинается с 1. Остальное выполняется с помощью простого цикла for. Вероятно, это не лучший способ справиться с моей проблемой.

   toggle(id) {
     var test = []
     test.push(123);
     for (var i = 1; i < 8; i  ) {
         if (id == i) {
             var temp = new Animated.Value(75);
             Animated.timing(
                temp, {
                   toValue: 150,
                   duration: 500,
                }
             ).start()
             test.push(temp);
         }
         else {
             var temp = new Animated.Value(75);
             Animated.timing(
                temp, {
                    toValue: 75,
                    duration: 1,
                }
             ).start()
             test.push(temp);
        }
     }
     this.setState({
         collapse: test
      });
  

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

Ответ №1:

Добавьте индекс к вашему компоненту TouchableHighlight и попробуйте затем

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

1. Извините, как бы мне это сделать?

2. Да, добавьте ключ, обработчик onPress не распознает, на каком элементе вы нажали. что-то вроде key={ключ ‘-выделить}