【发布时间】:2021-09-27 12:00:06
【问题描述】:
尝试在 React Native 中管理父/子组件之间的状态。使用功能组件和钩子。我希望我的 Collection 组件(父级)能够在从子级调用 onDelete 函数后更新数组的状态。我一直在调整功能,但似乎无法让它工作。提前致谢!
家长:
const Collection = () => {
const navigation = useNavigation();
const [showAddGuitar, setShowAddGuitar] = useState(false);
const [gtrlist, setGtrlist] = useState(GUITARS);
const [selectedGuitar, setSelectedGuitar] = useState({});
// Open Details Page
const openDetails = (guitar) => {
setSelectedGuitar(guitar);
navigation.navigate("Details", {
id: guitar.id,
year: guitar.year,
brand: guitar.brand,
model: guitar.model,
sn: guitar.sn,
description: guitar.description,
history: guitar.history,
});
};
// Delete Guitar
const deleteGuitar = (id) => {
setGtrlist(gtrlist.filter((guitar) => guitar.id !== id));
console.log(gtrlist);
};
return (
<View>
{showAddGuitar && (
<GuitarModal onAdd={addGuitar} onCloseModal={onCloseModal} />
)}
{gtrlist.length <= 0 && <Text>Collection empty</Text>}
{gtrlist.length > 0 && (
<FlatList
onDelete={deleteGuitar}
data={gtrlist}
keyExtractor={(item) => item.id.toString()}
renderItem={({ item }) => (
<Text
style={styles.item}
onPress={() => openDetails(item)}
>
{item.year} {item.brand} {item.model}
</Text>
)}
/>
)}
<Button
title="Add New Guitar"
style={[styles.footer, styles.button, styles.buttonOpen]}
onPress={handleAddNewGuitarPress}
/>
</View>
孩子:
const DetailsPage = ({ route, navigation, onDelete }) => {
const { id, year, brand, model, sn, description, history } = route.params;
return (
<View>
<Text>
{year} {brand} {model}
</Text>
<Text>S/N: {sn}</Text>
<Text>Description: {description}</Text>
{history &&
history.map((item) => (
<Text key={item.id}>
{item.date} {item.item} {item.cost}
</Text>
))}
<View>
<Button title="Go back" onPress={() => navigation.goBack()} />
<Button
title="Delete guitar"
onPress={() => onDelete(id)}
/>
</View>
</View>
);
};
【问题讨论】:
-
1- 我在你父母的任何地方都看不到任何“deleteGuitar”功能。所以它是未定义的。 2 - 您没有将任何函数传递给 DetailsPage
-
你应该在父组件上定义
deleteGuitar函数。const deleteGuitar = (id) =>{//delete operation} -
使用反应上下文或尝试反冲 (recoiljs.org/docs/introduction/getting-started) 并共享状态,您可以尝试通过导航参数传递 onDelete,但我不确定如果以某种方式卸载父级是否会起作用。跨度>
-
对不起各位!我搞砸了剪切和粘贴... deleteGuitar 现在在代码 sn-p 中!我的错。 :(@İlker
-
嗯,但你为什么将它传递给 flatlist?
标签: javascript reactjs react-native function native