Как передать реквизит из элемента FlatList в модал?

Я реализовал компонент View, содержащий FlatList, который отображает TouchableHighlights. Также я реализовал модальный компонент, который я хотел бы импортировать в различных местах, включая компонент, который отображает FlatList.

Мне уже удалось открыть модал снаружи (через передачу реквизита для наглядности, доступ к нему через nextProps и установку для этого значения состояния режима "modalVisible") и закрытие его изнутри (просто путем изменения значения состояния "modalVisible"),

НО: я также хочу передать данные в модальное состояние из каждого элемента FlatLists. Элемент, отображаемый как TouchableHighlight, должен открывать модальное окно onPress, а модальное поле должно содержать данные из элемента (в приведенном ниже коде это будет идентификатор элемента). Как я могу добиться передачи данных на модал? Я почему-то не могу заставить его работать с помощью nextProps. Похоже, это больше проблема, связанная с установкой состояния внутри элемента FlatLists, а не с модальным.

Modal:

export default class ModalView extends React.Component {
constructor() {
  super();
  this.state = {
    modalVisible: false,
    id: null,
  };
}

componentWillReceiveProps(nextProps) {
  this.setState({
    modalVisible: nextProps.modalVisible,
    id: nextProps.id,
  })
}

render() {
  return (
     <Modal
      animationType="slide"
      transparent={ true }
      visible={ this.state.modalVisible }
      onRequestClose={() => { this.props.setModalVisible(false) }}
     > 
       <View>
         <View>
          <Text>{ this.state.id }</Text>
          <TouchableHighlight
            onPress={() => { this.props.setModalVisible(false) }}
          > 
            <Text>Hide Modal</Text>
          </TouchableHighlight>
         </View>
       </View>
     </Modal>
  )
}
}

FlatList рендеринг TouchableHighlights:

export default class RecentList extends React.Component {
constructor() {
  super();
  this.state = {
    modalVisible: false,
    id: null,
  }
}

_onPressItem(id) {
  this.setState({
    modalVisible: true,
    id: id,
  });
};

_renderItem = ({item}) => {
  return (
    <TouchableHighlight
      id={item.id}
      onPress={this._onPressItem}
    >
      <View>
        <Text>{id}</Text>
      </View>
    </TouchableHighlight>
  )
};

render() {
  let data = realm.objects('Example').filtered('completed = true')
             .sorted('startedAt', true).slice(0, 10)
  return (
    <View>
      <ModalView
        modalVisible={ this.state.modalVisible }
        setModalVisible={ (vis) => { this.setModalVisible(vis) }}
        id={ this.state.id }
      />
      <FlatList
        data={data}
        renderItem={this._renderItem}
        keyExtractor={(item, index) => index}
      />
    </View>
  )
}
}

1 ответ

Решение

Маленькая ошибка, которую вы пропустили...

_renderItem = ({item}) => {
  return (
    <TouchableHighlight
      id={item.id}
      onPress={() => this._onPressItem(item.id)} // Your not sending the item.id
    >
      <View>
        <Text>{id}</Text>
      </View>
    </TouchableHighlight>
  )
};
Другие вопросы по тегам