2015-07-13 2 views
9

Я просто изучаю React Native, и я хочу создать серию кнопок с использованием динамических данных. Мой текущий код:React Собственные параметры прохождения через функцию карты

var locations = this.state.campus.map(function(item, key){ 
      return(
       <TouchableHighlight key={key} 
       style={[styles.button, (this.state.location==={item} && styles.buttonPressed)]} 
       underlayColor='#dddddd' 
       onPress={()=>this.buttonPress({item})} > 
       <Text style={ 
        styles.plainText}>{item}</Text> 
      </TouchableHighlight> 
      ) 

Моя проблема с линиями

style={[styles.button, (this.state.location==={item} && styles.buttonPressed)]} 

и

onPress={()=>this.buttonPress({item})} 

я пытаюсь генерировать эти строки, используя данные динамически выключения функции карты. Эти строки кода работают отлично, если я использую статические данные (т. Е. Генерирую каждую кнопку отдельно), но не используя динамические данные. Код действительно создает дисплей, поэтому проблема связана не с рендерингом, а с функциональностью.

При нажатии кнопки я получаю сообщение об ошибке undefined не в объекте, в то время как стиль просто вызывает отображение всего дисплея.

Очевидно, что динамические данные ({item}) работают внутри элемента Text, но не передаются другим элементам в качестве данных. Я попытался использовать {{item}}, но это вызывает синтаксическую ошибку.

Есть ли способ обрабатывать динамические данные, подобные этому в React Native?

+0

Для кого-то в будущем ... предлагаемое здесь решение может помочь: http://stackoverflow.com/questions/35663375/how-to-pass-a-component-reference-to-onpress-callback –

+0

вопрос происходит потому, что вы являетесь функцией usin (item, key) {и вам нужно использовать функцию стрелки var locations = this.state.campus.map ((item, key) => {return miukki

ответ

9

В обоих случаях вы необязательно обертываете item в {}. Для обеих этих строк выражения внутри внешнего {} являются чистым javascript (массивом и функцией) и должны следовать синтаксису javascript.

Так линии следует читать следующим образом:

style={[styles.button, (this.state.location===item && styles.buttonPressed)]} 

и

onPress={()=>this.buttonPress(item)} 
+0

Возможно, вы правы, однако это не решает проблему, это просто создает больше ошибок. Теперь я думаю, что вся моя конструкция неправильная, поэтому я вернусь к чертежной доске и выработаю, как это сделать по-другому. Мне кажется, мне нужно создать эти кнопки в ListView. – nwilliams36

+0

Вы должны [всегда избегать использования функций 'bind' или стрелок внутри JSX/внутри функции« render ») (https://stackoverflow.com/questions/36677733/why-shouldnt-jsx-props-use-arrow-functions -or-bind), потому что каждый раз, когда один из них нажимает каждый новый элемент, каждый элемент в списке/массиве/карте перерисовывается, если вы не предоставляете собственную функцию сравнения в 'shouldComponentUpdate', которая пропускает сравнение поле 'buttonPress'. – hippietrail

1

Вы должны хранить это в другой переменной: пусть _this = это;

Затем используйте _this вместо этого

+0

Добро пожаловать в переполнение стека! Это действительно комментарий, а не ответ. С немного больше rep, [вы сможете оставлять комментарии] (// stackoverflow.com/privileges/comment). – manetsus

+0

Не могли бы вы привести пример создания этой переменной? –

0

этот вопрос произошел потому, что вы используете функцию (пункт, ключ) {и вы должны использовать функцию стрелы

let locations = this.state.campus.map((item, key) => { return <TouchableHighlight key={key}.. 

вы должны сделать это для донжона используя «этот» контекст

-1

этот метод работы: 1) Создать функцию для создания элементов с динамическими DATAS

createElement = (item) => { 
    return(
     <TouchableHighlight onPress={()=>this.buttonPress({item})}> 
      <Text style={ styles.plainText }> {item} </Text> 
     </TouchableHighlight> 
    ) 
}; 

2) Используйте эту функцию в визуализации функции, как в последующем примере:

render (
    elementsList = []; 
    for (var i = 0; i < 10; i++){ 
     elementsList.push(this.createElement(i)); 
    }; 

    return (
     <View> 
      {elementsList} 
     </View> 
    ) 
); 

Это работает, если вы знаете, как использовать это.

+0

https://stackoverflow.com/questions/36677733/why-shouldnt-jsx-props-use-arrow-functions-or-bind – hippietrail

Смежные вопросы