【问题标题】:Trying to pass function to child component React Native - Keep getting '...not a function' and '...undefined' errors尝试将函数传递给子组件 React Native - 不断收到“...不是函数”和“...未定义”错误
【发布时间】: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) =&gt;{//delete operation}
  • 使用反应上下文或尝试反冲 (recoiljs.org/docs/introduction/getting-started) 并共享状态,您可以尝试通过导航参数传递 onDelete,但我不确定如果以某种方式卸载父级是否会起作用。跨度>
  • 对不起各位!我搞砸了剪切和粘贴... deleteGuitar 现在在代码 sn-p 中!我的错。 :(@İlker
  • 嗯,但你为什么将它传递给 flatlist?

标签: javascript reactjs react-native function native


【解决方案1】:

你不能从 props 中解构 onDelete,因为你没有通过 props 传递 onDelete。其实你根本没有通过。当您使用参数传递其他详细信息时,您也可以使用它传递 onDelete 函数。

 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 上对其进行解构。但我不太确定删除吉他后会发生什么,因为您不会在该页面上看到详细信息。

【讨论】:

  • IMO 我认为使用一些共享状态(React 上下文)比将 deleteGuitar 传递给它更好,你永远不知道“父”组件会发生什么。它可以在导航时卸载,并且 deleteGuitar 不起作用。
  • 好吧,他说他想传递那个函数所以..我不想更深入
  • 非常感谢大家对我的菜鸟问题的帮助!对不起,我缺乏理解。我刚刚阅读了一些关于反应上下文的内容,它看起来是一个很酷的解决方案,但我仍然想尝试理解为什么即使我将 onDelete 函数作为参数传递,我仍然会收到这些“不是函数”消息。我尝试将参数'deleteGuitar'和'onDelete:deleteGuitar'都作为参数传递,然后将其添加到详细信息页面上的route.params。我一定是在做一些愚蠢的事情,因为当我从 onPress 调用该函数时,我仍然收到相同的消息。
  • @RenaissanceMan 你是否从参数中解构了函数?
  • 好的,感谢@İlker 和@MarioLucki,我终于让它工作了!我遵循了将函数作为参数传递和解构的建议,在发现我有一个愚蠢的语法错误之后,它现在正在工作!真的很感谢帮助! :D :D
猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2019-07-11
相关资源
最近更新 更多