0Pricing
Vue Academy · 课时

使用 useMutation 修改数据

useMutation(MUTATION)、mutate()、缓存更新策略,以及乐观响应

使用 useMutation 修改数据 是 CoddyKit 上的免费 Vue Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Vue Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Vue Academy 课程共包含 4 节课。

使用变更操作修改数据

查询用于读取数据;变更操作用于修改数据,例如创建、更新和删除。useMutation 组合式函数会运行 GraphQL 变更操作,并提供一个准备好后即可调用的 mutate 函数。

useMutation 基本用法

传入一个变更操作文档。与 useQuery 不同,它不会立即运行,而是返回一个由您在事件发生时调用的 mutate 函数。

import { useMutation } from '@vue/apollo-composable'
import { gql } from '@apollo/client/core'

const { mutate } = useMutation(gql(
  'mutation { addPost { id } }'
))

触发变更

请在事件处理程序中调用 mutate(),例如在表单提交处理程序中调用。它会返回一个最终得到结果的异步承诺对象。

async function submit() {
  await mutate()
}

传递变量

向 mutate 传入一个变量对象。变更文档会使用 $ 语法声明这些变量。

const { mutate } = useMutation(gql(
  'mutation($title: String!) { addPost(title: $title) { id title } }'
))
function add(title) {
  return mutate({ title })
}

加载状态与错误

useMutation 还会返回 loading 和 error 引用,因此您可以禁用提交按钮并显示失败信息。

<template>
  <button :disabled="loading" @click="submit">Save</button>
  <p v-if="error">{{ error.message }}</p>
</template>

响应成功

变更成功后,onDone 钩子会触发——您可以清空表单、显示提示消息或跳转到其他页面。

const { mutate, onDone } = useMutation(ADD_POST)
onDone((res) => {
  console.log('Created', res.data.addPost.id)
})

更新缓存

执行变更后,Apollo 缓存可能已经过时。update 函数允许您直接修改缓存,让界面反映这一变化,而无需重新获取数据。

useMutation(ADD_POST, {
  update(cache, { data }) {
    const existing = cache.readQuery({ query: GET_POSTS })
    cache.writeQuery({
      query: GET_POSTS,
      data: { posts: [...existing.posts, data.addPost] }
    })
  }
})

为何直接更新优于重新获取

缓存 update 可以避免额外的网络往返。由于您将新项目写入了所有 useQuery 都会读取的缓存,它会立即显示出来。

改为重新获取查询

如果手动编辑缓存过于繁琐,可以使用 refetchQueries,在变更完成后重新执行指定的查询。

useMutation(ADD_POST, {
  refetchQueries: [{ query: GET_POSTS }]
})

乐观响应

optimisticResponse 会在服务器回复之前更新界面,并假定请求会成功。如果请求失败,Apollo 会自动回滚这项更改。

mutate(
  { title: 'New' },
  {
    optimisticResponse: {
      addPost: { __typename: 'Post', id: 'temp', title: 'New' }
    }
  }
)

乐观界面的意义

乐观更新会让应用感觉即时响应——用户可以立即看到自己的操作生效。与 update 结合使用时,临时项目会在真实服务器数据到达后替换为该数据。

快速检查

测试您对变更的掌握程度。

回顾

您已经学习了变更:

  • useMutation 会返回一个 mutate 函数,您可以在事件中调用它。
  • 向 mutate() 传入变量,并使用 loading/error 和 onDone。
  • 变更后的 update 函数会编辑缓存,从而避免重新获取数据。
  • optimisticResponse 会立即更新界面,并自动回滚。

常见问题解答

「使用 useMutation 修改数据」课时是免费的吗?

是的 — 「使用 useMutation 修改数据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Vue Academy 课程的其余内容,请升级到 CoddyKit PRO。 Vue Academy 课程共包含 4 节课。

「使用 useMutation 修改数据」这节课中我会学到什么?

useMutation(MUTATION)、mutate()、缓存更新策略,以及乐观响应 你通过在浏览器中直接运行的动手代码来练习 Vue Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Vue Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Vue Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 useMutation 修改数据」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Vue Academy 课中编写并运行代码吗?

能。每节 Vue Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 在 Vue 3 中配置 Apollo Client
  2. 使用 useQuery 获取数据
  3. 使用 useMutation 修改数据
  4. 使用 useSubscription 实现实时订阅
← 返回 Vue Academy