【问题标题】:Passing props to UseEffect hook from Parent component从父组件将道具传递给 UseEffect 钩子
【发布时间】:2021-01-16 09:03:07
【问题描述】:

我正在尝试将道具从我的父组件传递给子组件。以下是重要的 sn-ps:

片段 1:这是包含道具(整数)的对象。

 const cardProps = {
        cardProps0: 0,

片段 2:这是父组件中的 Card 组件,将 prop 传递给子组件

return (
<MyCardLink source={cardProps.cardProps0} />

片段 3:这是子组件 (MyCardLink)

useEffect((props) => {
        axios
            .get(
                'http://newsapi.org/v2/everything?q=economy&apiKey=XXXXXXXXXXXXXXXX'
            )
            .then((res) => {
                console.log(res);
                setNews(res.data.articles[props.source]);
            })
            .catch((err) => {
                console.log(err);
            });
    }, []);

目标是 [prop.source] 包含来自 API 提供的数组列表中的数字值。如果我只是在子组件 (MyCardLink) 中放置一个数字值来代替 setNews 函数上的 [props.source],那么它会使组件没有问题。

我的问题是当我将 prop 从父组件传递到子组件并使用 [prop.source] 时,没有任何渲染,我从控制台日志中得到的只是:

无法读取未定义的属性“源”。

我做错了吗?

【问题讨论】:

    标签: javascript reactjs rest axios react-hooks


    【解决方案1】:

    您需要将MyCardLink 组件的参数添加为:

    const MyCardLink = (props) => {
        // your component's defintion
    }
    

    此外,您可以按以下方式解构:

    const MyCardLink = (props) => {
       const { source } = props
    
       // ... rest
    }
    

    然后您可以在没有props 的情况下在您的useEffect 中使用:

    useEffect(() => {
       axios.get(
              'http://newsapi.org/v2/everything?q=economy&apiKey=XXXXXXXXXXXXXXXX'
           )
           .then((res) => {
                console.log(res);
                setNews(res.data.articles[source]);
           })
           .catch((err) => {
                console.log(err);
           }
       );
    }, []);
    

    根据您在评论部分提出的其他问题,我会做的是:

    1. 将状态的初始值从""更改为nullconst [news, setNews] = useState(null)
    2. 此外,我会使用 &amp;&amp; 来检查 null 并渲染 &lt;Card /&gt; 组件,前提是它在您的 return 中具有 news &amp;&amp; &lt;Card className={classes.root}&gt; 的值。

    这背后的原因是您的 API 响应是异步到达的。

    【讨论】:

    • 是的,也试过了。我无法读取未定义的属性“url”。这是component codebase 的链接。我敢肯定,幕后发生了一些我不知道的事情。
    • @Pacholoamit 看来您共享了一个空代码库,我看到的是一个基本的 Hello CodeSandbox 文本。
    • 哎呀,对不起,我忘了保存嘿嘿。请立即检查 app.js 组件。
    • @Pacholoamit 是的,我猜Ternary Operator 也适用于这种情况。继续努力,学习新东西总是很有趣!
    • @Pacholoamit 乐于助人! :D
    【解决方案2】:

    在下面的组件中使用 use props:

    const MyCardLink =(props)=>{
     ...
     ...
     ...
    }
    export default MyCardLink;
    

    【讨论】:

    • 是的,也试过了。我无法读取未定义的属性“url”。这是component codebase 的链接。我敢肯定,在幕后发生了一些我不知道的事情。
    • 谢谢。我不明白你的意思?请帮助更多
    • 我做了 const MyCardLink =(props) =>.... 但我收到错误消息“无法读取未定义的属性 'url'”。该链接是我整个组件的代码库,因此您可以查看整个图片
    • 怎么看主图。它在哪里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2020-11-23
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多