npm 包 redux-optimistic 使用教程

阅读时长 9 分钟读完

何为 redux-optimistic

redux-optimistic 是一个 Redux 的增强库,它可以在 Redux 中实现乐观更新。Redux 的状态管理中,每次 dispatch action 都是同步更新状态的,而 redux-optimistic 可以允许我们在发送一个 action 后,可以先在本地对状态进行更新,等待服务端响应后再进行最终更新。这一过程可以给用户更好的交互体验和更快的响应速度。

如何安装和使用

redux-optimistic 是通过 npm 来安装和使用的,可以使用以下命令来安装:

之后,在 Redux 中引入 redux-optimistic,使用 optimistic 函数增加中间件,如下所示:

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

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

然后我们便可以在 action 中使用 optimistic 函数对 action 进行封装,如下所示:

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

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

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

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

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

其中,optimistic 函数的参数是一个对象,它包含了 action 的 type、payload 等信息,在 meta 中,我们可以指定向后端发送什么样的请求,并在获取到响应后进行处理。在 action 创建函数返回的 action 中,我们需要根据是否有错误以及是否为乐观更新来处理状态。

在 reducer 中,我们需要对 action 进行判断,如下所示:

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

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

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

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

在 reducer 中,我们首先判断 action 是否为失败状态,然后判断当前是否为乐观更新,最后再对成功状态进行处理。

示例代码

接下来,我们将编写一个简单的 TodoList 来展示 redux-optimistic 的使用。

安装依赖

首先,我们需要安装 React 和相关依赖:

其中,react-redux 负责将 React 组件与 Redux 进行绑定,redux-thunk 负责处理异步请求,redux-optimistic 则是我们本文的主角。

编写组件

然后,我们开始编写一个简单的 TodoList 组件。

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

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

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

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

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

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

在组件中,我们通过 useSelector 来获取 Redux store 中的状态,而通过 useDispatch 来获取 dispatch 方法,从而可以 dispatch 一个 action。

在组件中,我们通过 addTodoRequest action 来对 Todo 进行添加操作,其中第二个参数为创建一个“临时 ID”,用来在本地先更新 Todo 列表。

编写 action

接下来,我们编写 addTodoRequest action,其中使用了 optimistic 函数进行封装:

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

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

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

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

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

在 action 中,我们将 optimistic 函数进行了包装,其中 meta 指定了我们向服务器发送请求的相关信息。

编写 reducer

最后,我们编写 reducer,处理我们最初为本地数据所添加的“临时 ID”:

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

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

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

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

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

在 reducer 中,我们首先处理错误状态,然后处理乐观更新状态,最后再处理真正的修改状态。

总结

通过以上的例子,我们可以看到,使用 redux-optimistic 可以让我们在 Redux 中实现乐观更新,从而达到更好的用户交互和响应速度。但是需要注意,乐观更新也会带来一些问题,例如某些场景下的冲突检测等,需要我们根据使用场景进行考虑。

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

纠错
反馈