使用 Redux-Thunk 实现异步操作

阅读时长 9 分钟读完

Redux 是一种 JavaScript 状态管理库,它可以帮助我们管理应用程序中的状态。但是如果使用 redux 时必须在 reducer 中将所有状态的修改操作尽可能的干净、简洁、无副作用的原则,对于异步操作的处理就稍显复杂。这时我们需要 Redux-Thunk 来帮助我们处理 redux 中的异步操作。

Redux-Thunk 是什么?

Redux-Thunk 是一个 redux 的中间件,它允许我们在 redux 中编写异步操作。 Redux-Thunk 帮助我们处理 redux 中的异步操作。其核心作用是将闲置的异步操作存储为 Thunk,该对象包含函数的异步操作。Redux-Thunk 中间件允许您编写 actions creators,可以返回一个函数而不是一个 action 对象。该函数接收 dispatch 方法作为第一个参数,可以在操作完成时调用,或者使用 getState 获取 store 的当前状态。

Redux-Thunk 的优势

使用了 Redux-Thunk 中间件,我们可以更方便地管理异步操作,当你需要在异步操作完成之后再更新 Redux 中的状态时,可以直接 dispatch 一个 action。使用 Redux-Thunk 的好处不仅仅是可以在 redux 中加入异步操作,还可以帮助我们处理预处理和异常处理,使代码更加可读和易维护。

Redux-Thunk 的使用

安装和引入

在使用 Redux-Thunk 前必须安装 redux-thunk 依赖包, 使用 npm 安装,命令如下:

安装完成后,在 redux createStore() 函数中将 reduxThunk 作为 applyMiddleware() 的参数,代码如下:

对于异步操作的 actions creators 进行修改

在使用 Redux-Thunk 之前,我们会这样编写 actions creators:

-- -------------------- ---- -------
------ ----- ---------- - -- -- -
  ------ ---------- -- -
    ------------------------------
    -----
      --------------------------------------------------
      ---------------- -- -
        ----- ----- - --------------
        -----------------------------------
      --
      -------------- -- -
        ----- -------- - --------------
        --------------------------------------
      ---
  --
--
展开代码

使用 Redux-Thunk 后,我们定义 actions creators 并将其异步部分封装在函数中:

-- -------------------- ---- -------
------ ----- ---------- - -- -- -
  ------ ----- ---------- -- -
    --- -
      ------------------------------
      ----- -------- - ----- --------------------------------------------------------
      ----- ----- - --------------
      -----------------------------------
    - ----- ------- -
      ----- -------- - --------------
      --------------------------------------
    -
  --
--
展开代码

示例代码

这里是一个简单的示例代码,展示了在 React 中使用 Redux-Thunk 进行挂载前向 API 发起请求,获得数据并更新 store 的流程,该示例下载后可在本地进行运行:

actions.js
-- -------------------- ---- -------
------ ----- ---- --------
------ ----- -------- - -----------
------ ----- ----------- - --------------
------ ----- ------------------- - ----------------------
------ ----- ------------------- - ----------------------
------ ----- ------------------- - ----------------------

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

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

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

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

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

-- ---- -----
------ ----- ---------- - -- -- -
  ------ ----- ---------- -- -
    --- -
      ------------------------------
      ----- -------- - ----- ------------------------------------------------------------------------------------------
      ----- ----- - -------------------
      -----------------------------------
    - ----- ------- -
      ----- -------- - --------------
      --------------------------------------
    -
  --
--
展开代码
reducer.js
-- -------------------- ---- -------
------ -
  ---------
  ------------
  --------------------
  --------------------
  --------------------
- ---- ------------

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

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

------ ------- --------
展开代码
App.js
-- -------------------- ---- -------
------ - ------------ ----------- - ---- --------------
------ - ---------- - ---- ------------

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

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

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

------ ------- ----
展开代码

总结

Redux-Thunk 使得对于 redux 中的异步操作变得简便,我们可以封装散布了的异步操作,并将其封装为纯函数。使用 Redux-Thunk,我们可以更加灵活地管理应用程序中的状态,更加优雅地执行数据的异步操作。而这仅仅是 Redux-Thunk 的其中一种用法,它还可以帮助我们处理预处理以及异常处理,使代码更加优雅、可读、易于维护。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fa2f9cf6b2d6eab3150651

纠错
反馈

纠错反馈