代码之家  ›  专栏  ›  技术社区  ›  user219882

反应路由器的奇怪组件生命周期

  •  2
  • user219882  · 技术社区  · 6 年前

    我有这条路线(简化)

    <Route 
      path="/foo/:id">
      render={({match}) => (
        <Page key={match.params.id} id={match.params.id}/>
      )}
    </Route>
    

    原因是当我从 /foo/1 /foo/2 我不想清除和更新现有组件的状态,在我的例子中,它太复杂了。所以我有一个动态键,它会导致卸载 /FoO/1 组件和安装一个全新的 /FoO/2 组件。

    到现在为止,一直都还不错。但这是个陷阱。我观察到的生命周期是这样的

    1. /FoO/1 重新渲染
    2. /FoO/2 建造师
    3. /FoO/2 组件安装
    4. /FoO/1 组件将卸载
    5. /FoO/2 提供

    为什么第一个组件不在第二个组件安装之前卸载?因此,我得到了奇怪的重新渲染和故障(它与Redux存储和初始化 /FoO/2 组件更改管理重新呈现仍存在组件的存储 /FoO/1 )有什么办法可以避免这种情况吗?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Max Bush    6 年前

    很难确切地确定您的代码片段发生了什么,但是,我相信您的问题与一些反模式有关;

    React组件构造函数只能用于两个方面:

    1. 初始化本地状态
    2. 绑定事件处理程序

    https://reactjs.org/docs/react-component.html#constructor

    第二,你使用的是 render prop带有内联函数,这意味着当检测到匹配的路由并且父组件重新呈现时,它将重新构造该组件,先卸载它,然后再次装载它。为了防止出现这种情况,您应该在父级渲染函数之外定义渲染函数。

    第三,因为你有一条动态路线 /foo/:id 并赋予 :id 对于子组件的键,react将其视为不同的组件,并且在当前渲染过程达到 un-mounting 阶段。这意味着在短时间内 <Page key={1} /> 和; <Page key={2}/> 出席。

    因为这三个问题,您得到的似乎是一个奇怪的组件生命周期,但事实上,它的反应正是您告诉它要做的。

    解决方案:

    1. 移动在的构造函数中调用的redux操作 <Page /> 加入 componentDidMount() 功能。
    2. 将内联渲染函数移动到父渲染函数之外。
    3. 删除 key 支柱。