返回

Apollo 入门指南(八):如何通过变更修改数据

前端

使用 Apollo Mutation 赋能 React 应用的数据修改功能

前言

在构建数据驱动的 React 应用时,我们经常需要修改后端数据库中的数据。Apollo Client 提供了 useMutation hook,它为 React 组件提供了优雅的方式来实现数据修改功能。本文将深入探讨如何使用 useMutation 来修改数据、优化用户体验,以及解决潜在的问题。

设置 Mutation

useMutation hook 接受两个参数:

  • Mutation 函数: 该函数负责将修改的数据发送到服务器,并返回一个包含服务器响应的 Promise。
  • Mutation 选项: 该对象允许配置变更的各种行为,例如乐观更新和错误处理。

以下是一个示例,展示如何在 React 组件中设置 mutation:

import { useMutation } from "@apollo/client";

const MyComponent = () => {
  const [updateTask, { loading, error }] = useMutation(UPDATE_TASK_MUTATION, {
    optimisticResponse: {
      __typename: "Mutation",
      updateTask: {
        __typename: "Task",
        id: "1",
        title: "New Title",
        completed: false,
      },
    },
  });

  const handleUpdateTask = () => {
    updateTask({ variables: { id: "1", title: "New Title" } });
  };

  return (
    <div>
      <button onClick={handleUpdateTask}>Update Task</button>
    </div>
  );
};

export default MyComponent;

在这个示例中,我们创建了一个 useMutation hook,它接受 UPDATE_TASK_MUTATION 函数和一个包含 optimisticResponse 选项的选项对象。optimisticResponse 指定了在服务器确认更改之前在客户端缓存中进行的乐观更新。

处理服务器端和客户端更新

当执行 mutation 时,Apollo 首先会在客户端执行乐观更新,立即更新本地缓存,即使服务器尚未确认更改。这有助于提升用户体验,因为它允许用户立即看到他们的更改,而无需等待服务器响应。

一旦服务器确认了更改,Apollo 就会用服务器端数据替换客户端缓存中的数据。如果服务器端更新与客户端更新不同,Apollo 会触发一个 __typenameMutation 的查询,其中包含服务器端更新的数据。

利用乐观更新优化用户体验

乐观更新可以显著提高用户体验,因为它允许用户立即看到他们的更改,而无需等待服务器响应。然而,在某些情况下,乐观更新可能会导致数据不一致,例如当多个用户同时修改同一数据时。

为了解决这个问题,Apollo 提供了一个名为 refetchQueries 的选项,它允许我们在 mutation 成功后重新获取某些查询。这确保了客户端缓存中的数据始终与服务器端的数据保持一致。

以下是一个示例,展示如何在 mutation 选项中使用 refetchQueries 选项:

const MyComponent = () => {
  const [updateTask, { loading, error }] = useMutation(UPDATE_TASK_MUTATION, {
    refetchQueries: ["TaskList"],
  });

  const handleUpdateTask = () => {
    updateTask({ variables: { id: "1", title: "New Title" } });
  };

  return (
    <div>
      <button onClick={handleUpdateTask}>Update Task</button>
    </div>
  );
};

export default MyComponent;

在这个示例中,当 updateTask mutation 成功后,Apollo 将重新获取 TaskList 查询,以确保客户端缓存中的数据与服务器端的数据保持一致。

常见问题解答

1. 什么是 mutation?

Mutation 是修改后端数据库中的数据的操作。在 React 应用中,我们使用 useMutation hook 来执行 mutations。

2. 乐观更新的好处和风险是什么?

乐观更新的好处是可以立即向用户展示更改,无需等待服务器响应。然而,它也存在导致数据不一致的风险,例如当多个用户同时修改同一数据时。

3. refetchQueries 选项如何防止数据不一致?

refetchQueries 选项允许我们在 mutation 成功后重新获取某些查询,以确保客户端缓存中的数据与服务器端的数据保持一致。

4. 如何处理 mutation 错误?

可以使用 error 属性来处理 mutation 错误。它是一个布尔值,在 mutation 失败时为 true。

5. 如何在 mutation 中使用变量?

变量可以在 mutation 函数中作为参数传递。它们允许我们根据用户的输入或其他动态数据定制 mutation。

结论

useMutation hook 为 React 组件提供了在不影响用户体验的情况下修改数据的强大方式。通过利用乐观更新并妥善处理服务器端和客户端更新,我们可以构建响应迅速且高效的数据驱动型应用。