Краткое изложение проблемы
Внутри моего Flatlist я хочу сохранить значение строки, на которую щелкнул пользователь, в массиве.
Каждая строка моего FlatList активна с помощью TouchableOpaicty.
Что я пробовал
Я искал в Интернете, но не нашел ответа, и я пытался сохранить данные в массив разными способами.
Код
Плоский список
<FlatList
data = {this.state.friends}
renderItem = {({item}) => {
console.info('item', item);
return(
<TouchableOpacity
onPress = {() => this.add(item.key)}
>
<ImageBackground
style = {styles.friendBubble}
source = {require('../../assets/images/friendDisplay.png')}
>
<Text style = {styles.friendText}>{item.key}</Text>
</ImageBackground>
</TouchableOpacity>
)
}}
/>
Функция TouchableOpacity onPress
add = (item) => {
this.setState(
{friendsInComp: [...this.state.friends, item]},
console.info('this.state.friend', this.state.friendsInComp)
)
}
Ожидаемые результаты
Каждый раз, когда я щелкаю по строке, значение этой строки должно добавляться в конец массива.
Фактические результаты
При первом щелчке по строке в массив не добавляется никакого значения. При каждом последующем щелчке строки значение предыдущего щелчка добавляется в конец массива.
Я хочу добавить значение в другое состояние. В частности, указанное выше состояние, this.state.friendsInComp
Причина, по которой при первом нажатии кнопки ваш журнал консоли печатает undefined, заключается в том, что setState является асинхронным. Таким образом, он напрямую печатает состояние, не дожидаясь, пока setState завершит процесс, если вы хотите увидеть последнее состояние после завершения setState, вам нужно поместить console.info внутрь функции.
add = (item) => {
this.setState({
friendsInComp: [...this.state.friends, item ]},
() => { console.info('this.state.friend', this.state.friendsInComp) }
)
}
и просто обратите внимание, когда вы сделали [...this.state.friends, item ]
, он только добавил начальное состояние друзей с новым элементом, который щелкнул пользователь, поэтому он не продолжает добавлять, чтобы отслеживать, какой пользовательский щелчок. Если вам нужно, чтобы состояние постоянно обновлялось, чтобы отслеживать клики пользователя. вы можете сделать что-то вроде этого.
add = (item) => {
const { friendsInComp } = this.state;
this.setState({
friendsInComp: !friendsInComp ? [...this.state.friends, item ] : [...friendsInComp, item]},
() => { console.info('this.state.friend', this.state.friendsInComp) }
)
}
используйте !friendsInComp
, если вы не определяете friendsInComp как пустой массив внутри конструктора. в противном случае используйте friendsInComp.length == 0
надеюсь на эту помощь.
Вы хотели добавить значение к своим данным FlatList или другому состоянию?