处理 React Router v4 和 Redux 集成的冲突

React Router 和 Redux 都是开发 React 应用必不可少的工具。React Router 是用来处理页面路由的,而 Redux 是用来做状态管理的。然而,当把它们集成在一起使用的时候,可能会出现一些冲突。本文将介绍如何处理 React Router v4 和 Redux 集成的冲突,并提供代码示例。

问题描述

在使用 React Router 和 Redux 的过程中,可能会出现以下问题:

  1. 路由切换时,Redux 的状态并没有被更新。
  2. 在路由组件中使用 Redux 的 connect 高阶组件会导致路由参数变化时组件没有重新渲染。
  3. 在路由组件中使用 withRouter 高阶组件会导致路由参数变化时组件没有重新渲染。

解决方案

下面将介绍如何解决上述问题。

问题一:路由切换时,Redux 的状态并没有被更新

这个问题是因为,React Router 和 Redux 是两个独立的工具,它们并不知道彼此的存在。因此,需要将它们集成在一起,才能让它们共同工作。

需要做的就是在路由组件中手动 dispatch 一个 action 来更新 Redux 的状态。可以使用 React Router 提供的 withRouter 高阶组件,来获取路由参数。示例代码如下:

------ ------ - --------- - ---- --------
------ - ---------- - ---- -------------------
------ - ------- - ---- --------------
------ - ---------- - ---- ------------

----- ----------- ------- --------- -
  ------------------- -
    ----- - -------- - - -----------
    ----- - -- - - ------------------------
    -------------------------
  -

  -------- -
    -- ---
  -
-

------ ------- -----------------------------------

在 componentDidMount 方法中,使用 this.props.match.params 来获取路由参数。然后,手动 dispatch 一个 action 来更新 Redux 的状态。

问题二:在路由组件中使用 Redux 的 connect 高阶组件会导致路由参数变化时组件没有重新渲染

这个问题是因为,当路由参数变化时,路由组件的 props 会发生变化,但是由于 connect 高阶组件的缓存机制,导致组件没有重新渲染。

可以使用 React Router 提供的 key 属性来强制让组件重新渲染。key 属性的值需要随着路由参数的变化而变化。代码示例如下:

------ ------ - --------- - ---- --------
------ - ------- - ---- --------------
------ - ---------- - ---- ------------

----- ----------- ------- --------- -
  ------------------- -
    ----- - -------- - - -----------
    ----- - -- - - ------------------------
    -------------------------
  -

  -------- -
    -- ---
  -
-

------ ------- -----------------------

使用 withRouter 高阶组件为组件提供路由相关的 props。然后,在路由组件中使用 key 属性来让组件强制重新渲染:

------ ------ - --------- - ---- --------
------ - ---------- - ---- -------------------
------ ----------- ---- ----------------

----- ------- ------- --------- -
  -------- -
    ----- - -- - - ------------------------
    ------ -
      ------------ -------- --
    --
  -
-

------ ------- --------------------

问题三:在路由组件中使用 withRouter 高阶组件会导致路由参数变化时组件没有重新渲染

这个问题和问题二类似,也是因为 withRouter 高阶组件的缓存机制导致的。可以和问题二一样,使用 key 属性来让组件强制重新渲染,代码示例如下:

------ ------ - --------- - ---- --------
------ - ---------- - ---- -------------------
------ - ------- - ---- --------------
------ - ---------- - ---- ------------

----- ----------- ------- --------- -
  ------------------- -
    ----- - -------- - - -----------
    ----- - -- - - ------------------------
    -------------------------
  -

  -------- -
    -- ---
  -
-

------ ------- -----------------------------------

----- ------- ------- --------- -
  -------- -
    ----- - -- - - ------------------------
    ----- --------------------- - ------------------------
    ------ -
      ---------------------- -------- --
    --
  -
-

------ ------- --------

同样使用 key 属性让组件强制重新渲染。需要注意的是,需要先将 withRouter 高阶组件和 connect 高阶组件合并,再使用 key 属性来让组件强制重新渲染。

结论

使用 React Router 和 Redux 可以让我们更方便地开发 React 应用。但是在使用它们的过程中,需要注意它们之间的集成问题。上面介绍的三个问题是最常见的问题。通过使用 withRouter 高阶组件和 key 属性,可以解决这些问题。希望本文对你有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6722ebe42e7021665e0d7aed