Redux 和 React - 异步操作的最佳实践

在现代的 Web 应用中,异步操作已经变得越来越普遍。一个典型的例子就是在向服务器请求数据时,很少立即收到响应。而在 React 应用中,由于单向数据流的限制,使得将异步操作和其它状态管理方式整合在一起不是那么容易。 这里我们就来介绍 Redux 和 React 结合使用时的异步操作的最佳实践。

Redux 和 React 的结合方式

Redux 是一个用于 JavaScript 应用的可预测状态容器,它帮助我们管理一系列的状态。Redux 与 React 配合使用,可以让你建立一个更加一致而且容易理解的应用,特别是在处理异步操作的方面。

在 Redux 中,我们把应用程序的状态存储在一个称为 store 的中心数据存储区中。这个 store 对象包含了应用程序中所有的状态。通过 dispatch actions,我们可以更新这些状态数据。而在 React 中,可以通过 React Redux 库连接 React 和 Redux,使得应用程序的状态管理更加得心应手。

Redux-thunk 中间件的使用

Redux-thunk 是一个为 Redux 设计的中间件,使得 dispatch 一个 Function 类型的 action 变得可用。这个 action 返回了一个函数,在函数内部处理异步操作。

下面是使用 Redux-thunk 中间件加载一个远程数据的示例:

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

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

这个 action creator 不是 action 对象,它返回一个函数,这个函数实际上做了异步请求并触发一个普通的同步 action。在这个函数中,我们通过 dispatch 一个 action 对象来表示异步请求的成功,并且将数据作为 payload 参数传递给这个 action。

使用 React-Redux 的 connect 方法

在 Redux 中,我们通过 connect 方法连接 React 组件和 Redux,并且在组件的 props 中包含了 store 中的状态和 action creators。

下面是一个加载远程数据的容器组件的示例:

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

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

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

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

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

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

在这个示例中的 MyComponent 容器组件,我们这么做:

  1. 在组件的 componentDidMount 生命周期中发起异步请求。
  2. 将 store 中的 state 映射到组件的 props 中。
  3. 将 action creators 映射到组件的 props 中。

这样做,我们就可以在组件内部通过 props 来使用属于 Redux 的状态和行为。

结论

通常情况下,Redux 和 React 的结合使用相对于传统的 React,虽然添加了更多的代码和改变了项目的结构,但是 Redux 能够更好地管理和共享状态和异步操作。希望这篇文章对你有所启发,让你可以在 Redux 和 React 中针对性地处理异步操作。

参考链接:

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