【问题标题】:ReactJS get data from axios and pass to another compontentReact JS 从 axios 获取数据并传递给另一个组件
【发布时间】:2020-03-22 19:23:57
【问题描述】:

我在此路径中有一个名为 Info 的组件:

compontent\Agent\Info

并从axios 中的componentDidMount 中获取data

async componentDidMount() {
        let data = await API.getData();

        this.setState({
            result: data.success
        });
    }

我将data 添加到state.result 并在这里得到this.state.result.unread_message,现在我想将this.state.result.unread_message 传递给另一个名为SideBar 的组件,以避免双重请求。像这样:

template\SideBar

代码:

<Label>{this.props.unread_message}</Label>

这些不是子级或父级,我如何将data 从一个组件中的 axios 传递到另一个组件?

我尝试并遵循了这个answer,但它没有按预期工作,并且还在信息中呈现整个侧边栏!

【问题讨论】:

  • 你能否展示这两个不同的模块,即它们之间的关系。
  • @Tejas 我认为他的意思是它们没有直接关系。它们根本没有耦合。它们位于应用程序的不同部分
  • @Tejas 没有关系,实际上 Info 打印用户信息,如姓名等,我将未读消息编号传递给此组件,我也想在侧边栏(包括、菜单)上显示。跨度>

标签: javascript reactjs


【解决方案1】:

这个问题有很多答案,有些更复杂,有些更基于标准,有些人会说“永远不要这样做”。

一个选项:在您的侧边栏组件中,创建一个全局函数window.onDataUpdate = (result) =&gt; { this.setState({result}) },作为示例。然后,当您在其他任何地方获得更新的数据时,您可以致电window.onDataUpdate(result)。很多人会认为这个答案是不可接受的,因为它使用了全局函数。根据您项目的规模和复杂性,也许这是真的,这不是正确的方法。如果这是一个真正简单的小项目,我可能会通过。

另一种选择是将对象存储在另一个文件中,您可以将其导入到两个文件中,从而允许您注册侦听器并触发更新。因此,当您的 Info 组件获得更新的结果时,它可以调用另一个对象上的“触发器”函数,进而调用所有已注册的回调侦听器。

甚至使用更新数据触发的普通默认 Javascript 事件。 following the guide here

在 React 世界中,这种场景的一个常见答案是也使用 Redux 存储状态。这可能过于复杂,特别是如果这是您唯一使用 redux 的事情。

【讨论】:

  • 绝对正确的全局事物是最好的方法,而 redux 仅对这件事来说非常复杂。另一种方法是他可以使用浏览器的本地存储。
【解决方案2】:

您可以为此使用 react 的 context API's。阅读更多关于它的信息here

【讨论】:

  • 我之前从未使用过上下文,但我想是时候我终于尝试了
  • 我使用 axios 从 api 获取数据,也使用异步等待,我在 context 中看到的,不认为在我的情况下工作
猜你喜欢
  • 2019-04-13
  • 2020-03-19
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2019-10-23
  • 2019-01-31
相关资源
最近更新 更多