reactjs - 重用传递给 OnPress 的相同道具时,如何在 FlatList 中实现 DRY?
问题描述
学习 React Native 我开始使用FlatList
和 React Navigation,虽然一切正常,但我一直在寻找一种方法来防止调用相同的道具。在我的父组件中:
const Parent = ({ navigation }) => {
return (
<>
<StatusBar hidden />
<FlatList
data={data}
renderItem={({ item }) => (
<Child
title={item.name}
color={item.color}
onPress={() =>
navigation.navigate(routes.PATH, {
title: item.name,
foo: item.foo,
color: item.color,
})
}
/>
)}
keyExtractor={item => item.id.toString()}
/>
</>
)
}
Parent.propTypes = {
navigation: PropTypes.object.isRequired,
}
我将所有内容传递给我的子组件:
const Child = ({ onPress = () => {}, title, color }) => {
return (
<TouchableOpacity onPress={onPress} activeOpacity={0.8}>
<View style={[styles.row, { backgroundColor: color ? color : colors.primary }]}>
<Text style={styles.text}>{title}</Text>
</View>
</TouchableOpacity>
)
}
Child.propTypes = {
onPress: PropTypes.func.isRequired,
title: PropTypes.string.isRequired,
color: PropTypes.string.isRequired,
}
有没有一种方法可以重用title
和color
在道具中并传递给函数?
解决方案
我并没有真正使用 react-native。你可以传入Child
renderItem。唯一的问题是您需要访问导航 onPress。也许你可以使用上下文。
理论上这应该有效
const Context = createContext();
const Child = ({ item }) => {
const {title, color} = item;
const navigation = useContext(Context);
const onPress = useCallback(() => navigation.navigate(routes.PATH, {
title: item.name,
foo: item.foo,
color: item.color,
}));
return (
<TouchableOpacity onPress={onPress} activeOpacity={0.8}>
<View style={[styles.row, { backgroundColor: color ? color : colors.primary }]}>
<Text style={styles.text}>{title}</Text>
</View>
</TouchableOpacity>
)
}
const Parent = ({ navigation }) => {
const createChild = (item) =>
return (
<>
<Context.Provider value={navigator}>
<StatusBar hidden />
<FlatList
data={data}
renderItem={Child}
keyExtractor={item => item.id.toString()}
/>
</Context.Provider>
</>
)
}
推荐阅读
- codeigniter - SHA 256/512 使用 codeigniter 加盐
- python - 已安装但仍然出现 RuntimeError: PyNaCl library required in order to use voice
- c# - 排序 WPF 数据网格正在使用 IsAsync 绑定挂起整个 GUI
- excel - Excel Table Slicer - 不同的行数
- dos - 需要查找 ms-dos 应用程序的命令解决方案吗?
- c# - 希伯来语字符在 iText 7 中以相反的顺序打印
- css - 如何使用 d-flex 在项目之间留出空间
- python - 如何在matplotlib中叠加两个热图?
- python - 在用户位于单独模型中的 Django Rest Framework 中针对当前用户过滤查询集
- javascript - 我是 nodejs 的新手,我收到参考错误:io is not defined ,我想不通