首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正在尝试将函数传递给子组件React Native -不断收到“...not a function”和“...undefined”错误

正在尝试将函数传递给子组件React Native -不断收到“...not a function”和“...undefined”错误
EN

Stack Overflow用户
提问于 2021-07-20 05:00:49
回答 1查看 32关注 0票数 0

正在尝试在React Native中管理父组件/子组件之间的状态。使用功能组件和钩子。我希望我的集合组件(父组件)能够在从子组件调用onDelete函数后更新数组的状态。我一直在调整函数,但似乎不能让它工作。提前感谢!

父级:

代码语言:javascript
复制
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>

孩子:

代码语言:javascript
复制
  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>
    );
};
EN

回答 1

Stack Overflow用户

发布于 2021-07-20 05:26:08

你不能从道具中解构onDelete,因为你不能通过道具传递onDelete。实际上,你根本没有通过它。虽然您使用params传递了其他详细信息,但您也可以使用它来传递onDelete函数。

代码语言:javascript
复制
 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,
        deleteGuitar,

    });
};

当然,您需要在DetailsPage上对其进行解构。但我不太确定删除吉他后会发生什么,因为你不会在那个页面上有详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68446980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档