Это может быть достигнуто без какой-либо внешней библиотеки, или вы можете использовать реагировать родной swiper, но эта библиотека имеет некоторые проблемы, когда дело доходит до выбора.
Подход, который вы можете использовать без какой-либо библиотеки:
state = {
data: [
{ key: '1', name: 'mark', selected: false },
{ key: '2', name: 'john', selected: false }
],
selectedItem: null
}
...
<FlatList
horizontal={true}
data={this.state.data}
extraData={this.state.selectedItem}
renderItem={this.renderItem}
/>
Вам нужны дополнительные данные, чтобы ваш FlatList
повторно отображался при нажатии на отдельный элемент.
Теперь внутри вашего метода renderItem вы можете просто использовать что-то вроде
renderItem =({item, index}) => {
return (
<TouchableOpacity
onPress={() => {
// I wrote it like this so you could understand.
// first get your previous array
const tempArray = this.state.data;
// If you want single selection, add the code I wrote in the end
here.
// second change the selected value of this item
tempArray[index].selected = true;
// update the state
this.setState({ data: tempArray, selectedItem: item });
// here selected Item is not used, but you might need it in future purpose.
}}
style={{ backgroundColor: item.selected ? 'orange' : 'white' }}>
</TouchableOpacity>
);
}
При таком подходе будут выбраны несколько элементов ... Если вы хотите отменить выбор предыдущего.
затем вам нужно отобразить предыдущий массив или использовать состояние selectedItem, чтобы найти элемент с помощью метода findIndex
для массивов (вам нужно реализовать его внутри onPress)
для карты, простой пример будет
const tempArray = tempArray.map((singleItem) => {...singleItem, selected: false }) );
ПРИМЕЧАНИЕ. Я написал этот код только здесь, поэтому в нем могут быть некоторые ошибки. Пожалуйста, дайте мне знать, если таковые имеются.