目前已經可以做到怎麼新增待辦事項,不過我們都還沒讓其顯示在畫面上,所以今天要來示範如何在 App 中使用 FlatList。
每個工具都有其特定的用途,就像你不會用錘子來切水果一樣。在展示長列表時,FlatList 是你的最佳工具。為什麼呢?
FlatList 是 React Native 所提供的列表元件,他有以下的優點:
讓我們在 src/componsnts 中新增一個 List.js。
由於這裡顯示的資料,是來自於我們昨天所建立的 context 狀態,所以要使用 useContetx 來讀取來自 Store 的資料。
import { useContext } from 'react'
import { SafeAreaView, FlatList, View, Text, StyleSheet } from 'react-native'
import { Store } from '../store'
前面提到 FlatList 可以自定義顯示的部分,所以第一步要先建立一個元件,使其顯示在列表中,有點像是在網頁中的 <li>。
const Item = ({ item }) => (
<View>
<Text>{item.text}</Text>
</View>
)
接著就可以使用 FlatList 了。
const List = () => {
const { state, dispatch } = useContext(Store)
const renderItem = ({ item }) => <Item item={item} />
return (
<SafeAreaView>
<FlatList
data={state.todos}
renderItem={renderItem}
keyExtractor={(item) => item.id}
/>
</SafeAreaView>
)
}
export default List
解釋一下 FlatList 中的參數:
useContext 中的 state 獲取待辦事項列表。Item 元件來實現。最後就可以在 App.js 使用 List 這個元件:
import List from './src/components/List'
export default function App() {
return (
<StoreProvider>
<SafeAreaView style={styles.container}>
<Head />
<List />
<StatusBar style='auto' />
</SafeAreaView>
</StoreProvider>
)
}
最後我們再稍微美化一下 List 的樣式,你可以自己設計樣式,或者也可以按照我的樣式:
const Item = ({ item }) => (
<View style={styles.item}>
<View>
<Text style={styles.itemText}>{item.text}</Text>
</View>
</View>
)
const List = () => {
// 程式碼省略
return (
<SafeAreaView style={styles.container}>
<FlatList
data={state.todos}
renderItem={renderItem}
keyExtractor={(item) => item.id}
/>
</SafeAreaView>
)
}
const styles = StyleSheet.create({
container: {
width: '90%',
marginTop: 20
},
item: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
width: '100%',
marginVertical: 10
},
checkboxAndText: {
flexDirection: 'row',
alignItems: 'center'
},
itemText: {
fontSize: 18,
fontWeight: '500',
marginLeft: 10,
color: '#fff',
},
finishItemText: {
textDecorationLine: 'line-through'
},
emptyWrap: {
alignItems: 'center',
justifyContent: 'center'
},
emptyText: {
color: '#fff',
fontSize: 18,
fontWeight: '500'
},
emptyImage: {
width: 200,
height: 200
}
})
最後展示一下畫面,明天見👋。
