Как передать реквизит из элемента 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>
)
};