在 GraphQL 中使用乐观更新

阅读时长 5 分钟读完

什么是乐观更新

乐观更新是一种优化策略,它将假设修改操作是成功的,而不等待服务器的响应。在前端应用中,如果用户提交了修改请求,通常需要等待服务器的响应来更新 UI,这个过程很可能会产生一些卡顿,影响用户体验。而通过乐观更新,前端应用可以在用户提交请求时立即更新 UI,假设修改操作成功,当服务器响应后再进行必要的更新。如果修改操作失败,可以回滚到之前的状态,或者通过其他手段提示用户。

GraphQL 中的乐观更新

在 GraphQL 中,通过使用 @optimisticUpdate 指令,可以实现乐观更新的功能。具体来说,可以将 @optimisticUpdate 作为一个字段的修饰符,用来描述当这个字段发生变化时相应的 UI 如何更新,而不需要等待服务器的响应。在后端完成数据修改后,也可以返回一个 OptimisticResponse 字段,用来告诉前端应用假设修改操作成功应该返回的数据,以便前端应用更新 UI。

一个使用乐观更新的示例

假设我们有一个 todo list 应用,它的后端使用了 GraphQL API,包含一个查询所有 todo 的接口和一个修改 todo 的接口。在前端应用中,在修改 todo 时使用乐观更新。

首先在后端定义一个修改 todo 的 mutation,如下所示:

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

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

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

然后在前端应用中,定义一个组件来展示 todo 的列表,并且实现修改 todo 的功能。

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

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

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

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

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

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

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

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

在上面的代码中,我们先定义了一个 UPDATE_TODO mutation,并且在组件中使用 useMutation hook 来获取这个 mutation 的函数。在点击 todo item 的时候,我们首先更新本地的 optimisticTodos 状态,然后调用 updateTodo 函数来请求服务器修改 todo 数据。在 updateTodo 函数调用时,我们使用 optimisticResponse 参数来告诉前端应用在假设修改操作成功时更新的数据,也就是 optimisticTodo 对象。

总结

乐观更新可以帮助我们提高前端应用的性能和用户体验。在 GraphQL 中,通过使用 @optimisticUpdate 指令,可以实现乐观更新的功能。在前端应用中,我们可以通过使用 useMutation hook 来调用 GraphQL mutation,同时在 mutation 函数调用时使用 optimisticResponse 参数来实现乐观更新。

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

纠错
反馈