Динамически изменять функцию обработчика onPress в реактивном нативе

Есть ли способ динамически изменить обработчик функции onPress в <FlatList>? У меня есть три функции onPress, которые мне нужно передать через массив. Как я могу динамически обновить функцию или имя функции, которое передается <TouchableOpacity> (см. мой код ниже)?

Мой входной массив:

const menu = [
{
  "id": 1,
  "route": "this.onBottonPressedHome.bind(this)",
  "info": "1"
},
{
    "id": 2,
    "route": "this.onBottonPressedSettings.bind(this)",
    "info":"2"
},
{
    "id": 3,
    "route": this.onBottonPressedHistory.bind(this)",
    "info": "3"
}

]

Мой плоский список:

<FlatList
horizontal = {true}
data = {menu}
keyExtractor = {item => item.id.toString()}
showsHorizontalScrollIndicator = {false}
renderItem = {({ item, index }) => (
    <TouchableOpacity
    onPress = {item.route}
    >
        <Card>
            <CardItem style = {{ backgroundColor: '#37BBE1'}}>
                <Body>
                    <View style = {{ paddingTop: 10, width: 135 }}>
                        <Text style = {{ fontSize: 12, textAlign:'justify', color: '#fff' }}>
                            {item.info}
                        </Text>
                    </View>
                </Body>
            </CardItem>
        </Card>
    </TouchableOpacity>

Когда я это делаю, я получаю сообщение об ошибке, указывающее, что bind не определено в массиве. Как я могу это решить?

Обновлять:

Я добился этого с помощью тернарных операторов, это хорошо? Создаст ли это какие-либо проблемы с производительностью?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
823
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю, ваш массив menu состоит из элементов объекта, которые имеют поля строкового значения (т.е. нет привязок «настоящих» функций).

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

render() {

  /* This handler dynamically selects the action to call, based on the "item"
  that the user has pressed */
  const onPressItemHandler = (item) => {
    switch(item.id) {
      case 1: {
        this.onBottonPressedHome();
        break;
      }
      case 2: {
        this.onBottonPressedSettings();
        break;
      }
      case 3: {
        this.onBottonPressedHistory();
        break;
      }
    }
  }

  return <FlatList
  horizontal = {true}
  data = {menu}
  keyExtractor = {item => item.id.toString()}
  showsHorizontalScrollIndicator = {false}
  renderItem = {({ item, index }) => (
      <TouchableOpacity
      onPress = { () => onPressItemHandler(item) }>
          <Card>
              <CardItem style = {{ backgroundColor: '#37BBE1'}}>
                  <Body>
                      <View style = {{ paddingTop: 10, width: 135 }}>
                          <Text style = {{ 
                             fontSize: 12, 
                             textAlign:'justify', 
                             color: '#fff' }}>
                              {item.info}
                          </Text>
                      </View>
                  </Body>
              </CardItem>
          </Card>
      </TouchableOpacity>)} />      
}

Он работает, я пробовал с троичным, он тоже работает! но есть ли в этом что-то неправильное?

Arvindh 14.02.2019 14:18

Хороший! Тернарные операторы хороши, хотя они могут затруднить чтение кода, если вам нужно рассмотреть много id случаев.

Dacre Denny 14.02.2019 20:01

Спасибо за предложение!

Arvindh 14.02.2019 21:02

Другие вопросы по теме