1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| import React, { useEffect, useState } from 'react'; import { FlatList, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
const MOCK = [ { name: 'Andy' }, { name: 'Beck' }, { name: 'Carl' }, ]
const RenderData = ({ item, selectedItems, onItemSelect }) => {
const [isSelected, setIsSelected] = useState(false); useEffect(() => {
if (selectedItems.some(selectedItem => selectedItem === item)) { setIsSelected(true) } else { setIsSelected(false) } }, [selectedItems])
return ( <TouchableOpacity onPress={() => { onItemSelect() }} style={[styles.item_btn, { backgroundColor: isSelected ? 'gray' : 'transparent' }]}> <Text>{item.name}</Text> </TouchableOpacity> ) }
export default function App() { const [selectedItems, setSelectedItems] = useState([]); const [isAllSelected, setIsAllSelected] = useState(false); const onItemSelect = (item) => { setSelectedItems(prev => prev.some((prevItem) => prevItem === item) ? prev.filter((prevItem) => prevItem !== item) : [...prev, item]) } const selectAll = () => { if (isAllSelected) { setSelectedItems([]) } else { setSelectedItems([...MOCK]) } }
useEffect(() => { if (selectedItems.length === MOCK.length) { setIsAllSelected(true) } else { setIsAllSelected(false) } }, [selectedItems])
return ( <View style={styles.container}>
<View> <TouchableOpacity onPress={selectAll} style={[styles.selectAll_btn, { backgroundColor: isAllSelected ? 'gray' : 'transparent' }]}> <Text>全選</Text> </TouchableOpacity> </View>
<View style={styles.flatlist_container}> <FlatList data={MOCK} renderItem={(cases) => <RenderData item={cases.item} selectedItems={selectedItems} onItemSelect={() => { onItemSelect(cases.item) }} />} keyExtractor={(cases, index) => index.toString()} style={{ width: '100%', }} /> </View>
</View > ); }
const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center', }, selectAll_btn: { borderWidth: 1, width: 80, height: 40, justifyContent: 'center', alignItems: 'center', }, flatlist_container: { borderWidth: 1, width: 200, height: 150, alignItems: 'center', marginTop: 20, }, item_btn: { height: 40, justifyContent: 'center', alignItems: 'center', }, });
|