【问题标题】:react, react-router, and async data loadingreact、react-router 和异步数据加载
【发布时间】:2016-11-03 03:40:06
【问题描述】:

我正在使用 react、alt.js 和 react-router,并使用基本的 CRUD 构建应用程序。 “创建项目”有一个菜单项,它会调出一个模式(使用 react-bootstrap ...)并在提交时触发一个操作以在后端创建一些模型,然后执行 browserHistory.push(如在 react-router 文档中推荐)完成后转到新创建项目的项目页面。

所以在基本情况下,这是可行的。例如,如果我在主应用程序页面上它可以工作。但是,如果我已经在另一个项目的项目详细信息页面上(假设我在 /item/1 上并且我刚刚创建了 /item/2,所以我试图从页面 /item/1 重定向到 /item/2)。

而且我的异步加载逻辑(好吧,至少对于 fetchItem 的操作调用)位于 componentDidMount 的 ItemViewPage 反应组件中,根据我可以在网上找到的所有示例,这似乎很典型。

问题是,如果页面当前已经渲染,componentDidMount 永远不会被调用,因为组件已经挂载(!)。所以我的页面 URL 更新为/item/2,但内容仍然是/item/1。

所以,我的问题是....是的。从componentDidMount 启动数据加载我错了吗?我是否应该使用其他生命周期方法(例如,componentWillReceiveProps,因为反应路由器将设置一个新 id)?或者是否有其他地方完全应该从那里触发数据加载(例如,react-router 是否有一些我不知道的功能可以处理这个问题)?

【问题讨论】:

  • ShouldComponentUpdate 是我的猜测,但最好发布一些代码。
  • 可能会有很多代码!但无论如何,只要输入问题,我就会尝试componentWillReceiveProps,并在那里测试if (this.props.params.id !== newProps.params.id) { this.props.fetchItem(newProps.params.id); },这似乎有效。我想这是有道理的,但让我感到惊讶的是它不能开箱即用。
  • 在不知道您的params 的情况下如何“开箱即用”地工作?无论如何,很高兴你让它工作。也许下一次,在发布问题之前做更多的研究;)
  • componentDidMount 仅在组件首次挂载时触发。所以componentWillReceiveProps 实际上是去这里的正确方式。
  • 大部分网上的例子都没有提到这一点。您必须在两种不同的生命周期方法中复制加载逻辑,这有点奇怪(至少我认为)。

标签: reactjs react-router alt.js


【解决方案1】:

由于 React 很聪明,并且知道您在路由中重复使用该组件,因此该组件将保持挂载状态。您选择的生命周期方法将无法处理该作业,因为它在组件的初始安装时被调用一次。

我建议您使用 componentWillReceiveProps 并在其中检查您的项目的 id 字段是否已更改。这意味着您可能应该更新,因为要呈现新的、不同的数据。

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 2017-09-28
    • 2020-08-08
    • 1970-01-01
    • 2023-04-05
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多