关于 pinia-colada-skilld
pinia-colada-skilld 是 @pinia/colada 的参考技能;它是基于 Pinia 的 Vue 数据获取层。内容涵盖缓存查询、变更操作、共享查询状态和缓存管理,面向 Vue 开发者。
主要功能
- 01支持响应式键的缓存查询
- 02变更操作与查询失效
- 03使用 defineQuery 共享查询状态
- 04可复用的类型化查询选项
- 05缓存管理与无限查询
适用场景
- 01获取依赖路由参数的数据
- 02变更后刷新缓存查询
- 03在组件间共享查询状态
- 04构建分页数据视图
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ skilld-dev/ vue-ecosystem-skills --skill pinia-colada-skilld安装后在 Claude Code 中输入/pinia-colada-skilld确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/infinite-queries.mdmigration.mdmutations.mdplugins.mdqueries.mdquery-cache.mdssr.md详细介绍
@pinia/colada 1.4.5
基于 Pinia 构建的 Vue.js 智能数据获取层。查询读取并缓存数据(useQuery),变更写入数据(useMutation),所有内容都存放在 Pinia store 中(useQueryCache、useMutationCache)。
- 文档:https://pinia-colada.esm.dev
- API 类型:准备好的软件包源码中的
dist/index.d.mts - 运行时导出:
dist/index.mjs:1487 - 对等依赖:
vue ^3.5.41、pinia ^2.2.6 || ^3.0.0 || ^4.0.2(从 1.4.1 起允许使用 pinia 4,package.json:91-94) - 捆绑的 codemod:软件包中的
codemods/rules/*.yaml
设置
npm install pinia @pinia/colada
import { createPinia } from 'pinia'
import { PiniaColada } from '@pinia/colada'
const app = createApp(App)
app.use(createPinia())
// install after pinia; the options object is required for correct typing
app.use(PiniaColada, {
queryOptions: { staleTime: 60_000 },
plugins: [],
})
全局选项放在 queryOptions / mutationOptions 下(dist/index.d.mts:1601-1618)。
心智模型
- 查询由其
key标识:一个可序列化为 JSON 的数组(EntryKey,dist/index.d.mts:119)。键具有层级结构:筛选时,{ key: ['todos'] }也会匹配['todos', { filter: 'done' }]。 status是数据状态:'pending' | 'success' | 'error'。asyncStatus是操作状态:'idle' | 'loading'。两者有意分开(https://pinia-colada.esm.dev/guide/queries.md)。- 默认值:
staleTime: 5000、gcTime: 300_000、refetchOnMount、refetchOnWindowFocus、refetchOnReconnect、enabled: true(dist/index.mjs:92-97)。Mutation 的gcTime默认值为60_000(dist/index.d.mts:1379)。
核心模式
基本查询
<script setup lang="ts">
import { useQuery } from '@pinia/colada'
const { state, asyncStatus } = useQuery({
key: ['todos'],
query: () => fetch('/api/todos').then(res => res.json()),
})
</script>
<template>
<div v-if="state.status === 'pending'">Loading...</div>
<div v-else-if="state.status === 'error'">{{ state.error.message }}</div>
<ul v-else>
<li v-for="todo in state.data" :key="todo.id">{{ todo.text }}</li>
</ul>
</template>
在模板中使用分组的 state 对象进行类型收窄。TypeScript 无法根据 status 收窄分开的 data / error 引用(https://pinia-colada.esm.dev/guide/queries.md)。
响应式键:传入 getter
query 函数读取的所有内容(路由参数、引用)都必须包含在 key 中。将 key 作为 getter 传入,这样依赖发生变化时查询就会重新获取:
const { data } = useQuery({
key: () => ['contacts', route.params.id as string],
query: () => fetch(`/api/contacts/${route.params.id}`).then(r => r.json()),
})
使用 enabled 为查询添加条件
当必需参数缺失时,避免发起无效请求(在 store 和全局查询中很常见):
useQuery({
key: () => ['decks', route.params.deckId],
query: () => fetchDeck(route.params.deckId as string),
enabled: () => 'deckId' in route.params,
})
类型安全的共享选项:defineQueryOptions
export const todoOptions = defineQueryOptions((id: string) => ({
key: ['todos', id],
query: () => fetchTodo(id),
}))
// single-function form; the returned key is tagged so queryCache infers TData
const { data } = useQuery(() => todoOptions(route.params.id as string))
const todo = queryCache.getQueryData(todoOptions('1').key) // typed
useQuery 接受选项,或返回选项的 getter(dist/index.d.mts:733)。从 1.0 起,已移除双参数形式 useQuery(options, paramsGetter);请参阅 references/migration.md。
共享查询状态:defineQuery
将多个组件使用的查询封装起来,让引用只创建一次,就像一个小型 Pinia store。设置函数必须是同步的:
export const useFilteredTodos = defineQuery(() => {
const search = ref('')
const query = useQuery({
key: () => ['todos', { search: search.value }],
query: () => fetchTodos(search.value),
})
return { ...query, search }
})
Mutation 与失效处理
const queryCache = useQueryCache()
const { mutate, isLoading } = useMutation({
mutation: (text: string) => createTodo(text),
async onSettled() {
await queryCache.invalidateQueries({ key: ['todos'] })
},
})
mutate(vars)不会拒绝;可在模板和事件处理程序中使用。mutateAsync(vars)返回一个 promise,失败时会拒绝。- 在选项对象中将
onMutate放在mutation之前,这样其返回的上下文就能在后续钩子中推断出来(dist/index.d.mts:1410-1433)。 - 乐观更新:在
onMutate中写入缓存;仅当缓存中仍是你的乐观值时,才在onError中回滚。完整模式请参阅 references/mutations.md。
查询没有 onSuccess / onError
这是有意为之:一个查询可能有多个监听器。请使用 watch(data, ...),或通过 PiniaColadaQueryHooksPlugin 使用全局钩子(https://pinia-colada.esm.dev/plugins/official/query-hooks.md)。
1.x 版本关键规则
useQuery(setup, paramsGetter)和useQueryState(setup, paramsGetter)已在 1.0.0 中移除。请使用随包提供的 codemod 进行迁移:ast-grep scan -r node_modules/@pinia/colada/codemods/rules/migration-0-21-to-1-0.yaml -i src(https://github.com/posva/pinia-colada/blob/main/CHANGELOG.md)。useQueryState(key)读取查询状态,但不发起请求;key是唯一参数(dist/index.d.mts:920-926)。initialData会将查询状态更改为success;placeholderData不会更改缓存(dist/index.d.mts:558-600)。- 若要手动重置条目的状态,请使用
queryCache.setEntryState(entry, state);通过setQueryData()将数据设为undefined不再会重置状态。 - 无限查询数据的结构为
{ pages, pageParams };请使用setInfiniteQueryData()(在 1.2.0 中添加),而非setQueryData(),来预填充无限查询条目。 - Devtools 是独立的软件包:
@pinia/colada-devtools。 - Nuxt:安装
@pinia/colada-nuxt模块;它会自动处理 SSR 序列化。
参考资料
- 查询:
useQueryAPI、选项、返回值、useQueryState、defineQuery、defineQueryOptions、键工厂 - 变更:
useMutationAPI、钩子和上下文、乐观更新、defineMutation、defineMutationOptions - 无限查询:
useInfiniteQuery、defineInfiniteQueryOptions、setInfiniteQueryData、maxPages - 查询缓存:缓存存储、失效、筛选器、手动缓存写入、错误代码
- 插件:插件 API、
PiniaColadaQueryHooksPlugin、TypesConfig扩展、官方插件软件包 - SSR:序列化和水合、惰性查询、
PiniaColadaSSRNoGc - 迁移:0.x 到 1.x 的变更和 codemod