pinia-colada-skilld
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chineseposva/pinia-colada @pinia/colada
@pinia/coladaposva/pinia-colada @pinia/colada
@pinia/coladaVersion: 0.21.4 (Feb 2026)
Tags: latest: 0.21.4 (Feb 2026)
References: Docs — API reference, guides • GitHub Issues — bugs, workarounds, edge cases • GitHub Discussions — Q&A, patterns, recipes • Releases — changelog, breaking changes, new APIs
版本:0.21.4(2026年2月)
标签:最新版:0.21.4(2026年2月)
参考文档:文档 — API参考、使用指南 • GitHub Issues — bug上报、解决方案、边缘场景处理 • GitHub Discussions — 问答、模式分享、实践方案 • 版本发布记录 — 更新日志、破坏性变更、新API
API Changes
API变更
This section documents version-specific API changes — prioritize recent major/minor releases.
-
BREAKING:— v0.20.0 refactored: removed
useInfiniteQuery(), changedmergetodata,{ pages, pageParams }→initialPage,initialPageParam→loadMore, andloadNextPageis now required (experimental) sourcegetNextPageParam -
BREAKING:installation — v0.14.0 moved global options to
PiniaColadaand requires an options object for typing:queryOptions: { ... }sourceapp.use(PiniaColada, {}) -
BREAKING:aliases —
useQuery()was renamed toisFetchingin v0.8.0 to better reflect its connection toisLoadingsourceasyncStatus -
BREAKING: Status split — v0.8.0 splitinto
status(data:status) and'pending'|'success'|'error'(operation:asyncStatus) source'idle'|'loading' -
BREAKING: Mutation IDs — v0.19.0 simplified mutation IDs to incremented numbers (starting at 1).now takes the ID, and
mutationCache.get()suffix is removed from keys source$n -
BREAKING: Cache Key structure — v0.16.0 refactored internal cache to support deeply nested objects for keys.now returns a plain string. Stricter types disallow
toCacheKeyin keys sourceundefined -
BREAKING:method renames —
queryCachewas renamed tocancelQuery()in v0.11.0, andcancel()was added for multiple cancellations sourcecancelQueries() -
BREAKING:→
setQueryState— v0.9.0 renamed thissetEntryStateaction to better match its purpose sourcequeryCache -
BREAKING: External— v0.18.0 now surfaces external abort signals as actual errors instead of silently ignoring them source
AbortError -
BREAKING:types — v0.13.0 changed
placeholderDatato only allow returningplaceholderData(notundefined) to improve type inference sourcenull -
BREAKING: Devtools dependency — v0.21.0 removed built-independency; use
@vue/devtools-apiinstead source@pinia/colada-devtools -
NEW:— v0.13.5 introduced infinite scrolling support (experimental) source
useInfiniteQuery() -
NEW:— v0.17.0 added this for easier state management without the full
useQueryState()return object sourceuseQuery -
NEW: Global Query Hooks — v0.8.0 introducedto manage
PiniaColadaQueryHooksPlugin,onSuccess, andonErrorsourceonSettled
Also changed: replaces v0.14.0 · removed v0.12.0 · replaces v0.17.0 · renamed v0.16.0 · → v0.8.0 · removed v0.12.0 · moved to plugin v0.10.0
serializeTreeMapserializetransformErrorEntryKeyEntryNodeKeyTResultTDataQueryPluginPiniaColadadelayLoadingRefinvalidateKeys本部分记录了特定版本的API变更——优先关注近期的主版本/次版本更新。
-
重大变更:— v0.20.0版本重构:移除了
useInfiniteQuery(),将merge改为data,{ pages, pageParams }重命名为initialPage,initialPageParam重命名为loadMore,并且现在必须传入loadNextPage(实验性特性)来源getNextPageParam -
重大变更:安装方式 — v0.14.0版本将全局选项移至
PiniaColada中,并且要求传入一个选项对象以支持类型提示:queryOptions: { ... }来源app.use(PiniaColada, {}) -
重大变更:别名 — v0.8.0版本将
useQuery()重命名为isFetching,以更准确地反映其与isLoading的关联 来源asyncStatus -
重大变更:状态拆分 — v0.8.0版本将拆分为
status(数据状态:status)和'pending'|'success'|'error'(操作状态:asyncStatus)来源'idle'|'loading' -
重大变更:Mutation ID — v0.19.0版本简化了Mutation ID为递增数字(从1开始)。现在接收该ID,并且键名中的
mutationCache.get()后缀已移除 来源$n -
重大变更:缓存键结构 — v0.16.0版本重构了内部缓存以支持键为深度嵌套对象。现在返回纯字符串。更严格的类型限制不允许键中出现
toCacheKey来源undefined -
重大变更:方法重命名 — v0.11.0版本将
queryCache重命名为cancelQuery(),并新增cancel()用于取消多个请求 来源cancelQueries() -
重大变更:→
setQueryState— v0.9.0版本重命名了这个setEntryState方法以更好地匹配其用途 来源queryCache -
重大变更:外部处理 — v0.18.0版本现在将外部中止信号显示为实际错误,而不是静默忽略 来源
AbortError -
重大变更:类型 — v0.13.0版本修改了
placeholderData,仅允许返回placeholderData(不允许undefined)以改进类型推断 来源null -
重大变更:Devtools依赖 — v0.21.0版本移除了内置的依赖;请改用
@vue/devtools-api来源@pinia/colada-devtools -
新增特性:— v0.13.5版本引入了无限滚动支持(实验性特性)来源
useInfiniteQuery() -
新增特性:— v0.17.0版本新增了该API,无需完整的
useQueryState()返回对象即可更轻松地管理状态 来源useQuery -
新增特性:全局查询钩子 — v0.8.0版本引入了来管理
PiniaColadaQueryHooksPlugin、onSuccess和onError来源onSettled
其他变更: 替代 (v0.14.0)· 被移除(v0.12.0)· 替代 (v0.17.0)· 重命名为 (v0.16.0)· → (v0.8.0)· 被移除(v0.12.0)· 移至插件中(v0.10.0)
serializeTreeMapserializetransformErrorEntryKeyEntryNodeKeyTResultTDataQueryPluginPiniaColadadelayLoadingRefinvalidateKeysBest Practices
最佳实践
- Use the grouped object for type-safe narrowing in templates — TypeScript cannot narrow destructured
stateordatarefs based on theerrorref due to Vue'sstatuswrapper limitations sourceRef
vue
<script setup lang="ts">
const { state } = useQuery({ key: ['user'], query: fetchUser })
</script>
<template>
<div v-if="state.status === 'success'">{{ state.data.name }}</div>
<div v-else-if="state.status === 'error'">{{ state.error.message }}</div>
</template>- Wrap shared reactive state in to prevent desynchronization — regular composables recreate refs for each component instance, causing only the first component to successfully trigger key-based reactivity source
defineQuery()
ts
export const useFilteredTodos = defineQuery(() => {
const search = ref('')
const query = useQuery({
key: () => ['todos', { search: search.value }],
query: () => fetchTodos(search.value),
})
return { ...query, search }
})- Combine hierarchical key factories with for strict type safety — this enables automatic type inference in
defineQueryOptions()methods without manual type casting or string-based key typos sourcequeryCache
ts
export const todoOptions = defineQueryOptions((id: string) => ({
key: ['todos', id],
query: () => fetchTodo(id),
}))
// Inferred TData: queryCache.getQueryData(todoOptions('1').key)-
Handle side effects viaor global plugins instead of query options —
watchintentionally lacksuseQuery/onSuccessto prevent side-effect duplication across multiple component instances sourceonError -
Preferover
refresh()for standard UI updates —refetch()respectsrefresh()and deduplicates in-flight requests, whereasstaleTimeforces a network call regardless of cache status sourcerefetch() -
Use theproperty for declarative cross-cutting concerns — attach metadata to queries to drive global UI behavior (like toast messages) within the
metasourcePiniaColadaQueryHooksPlugin -
Verify cache state before performing optimistic rollbacks — always check if the current cache value matches the optimistic value into avoid overwriting concurrent successful updates from other mutations source
onError
ts
onError(err, vars, { newTodo, oldTodo }) {
if (newTodo === queryCache.getQueryData(['todos'])) {
queryCache.setQueryData(['todos'], oldTodo)
}
}-
Usefor manual status synchronization — this is the preferred way to manually update an entry as setting data to
queryCache.setEntryState()viaundefinedis no longer supported for state resets sourcesetQueryData() -
Explicitly importfrom
useRoutein Nuxtvue-routerdefinitions — the Nuxt auto-imported version can cause unnecessary query triggers ordefineQueryvalues due to Suspense integration sourceundefined -
Use thegetter to guard "immortal" queries in global stores — prevents queries inside Pinia stores from making invalid network requests when required reactive parameters (like route params) are absent source
enabled
ts
const result = useQuery({
key: () => ['deck', route.params.id],
query: () => fetchDeck(route.params.id),
enabled: () => !!route.params.id,
})- 在模板中使用分组的对象实现类型安全的分支判断——由于Vue的
state包装器限制,TypeScript无法根据Refref对解构后的status或dataref进行类型收窄 来源error
vue
<script setup lang="ts">
const { state } = useQuery({ key: ['user'], query: fetchUser })
</script>
<template>
<div v-if="state.status === 'success'">{{ state.data.name }}</div>
<div v-else-if="state.status === 'error'">{{ state.error.message }}</div>
</template>- 将共享响应式状态包装在中以防止不同步——常规的组合式函数会为每个组件实例重新创建ref,导致只有第一个组件能成功触发基于键的响应式更新 来源
defineQuery()
ts
export const useFilteredTodos = defineQuery(() => {
const search = ref('')
const query = useQuery({
key: () => ['todos', { search: search.value }],
query: () => fetchTodos(search.value),
})
return { ...query, search }
})- 将分层键工厂与结合使用以实现严格的类型安全——这能在
defineQueryOptions()方法中实现自动类型推断,无需手动类型转换或避免基于字符串的键名拼写错误 来源queryCache
ts
export const todoOptions = defineQueryOptions((id: string) => ({
key: ['todos', id],
query: () => fetchTodo(id),
}))
// 自动推断TData: queryCache.getQueryData(todoOptions('1').key)-
通过或全局插件处理副作用,而不是通过查询选项——
watch刻意不提供useQuery/onSuccess,以防止副作用在多个组件实例中重复执行 来源onError -
对于标准UI更新,优先使用而不是
refresh()——refetch()会尊重refresh()并对正在进行的请求进行去重,而staleTime会强制发起网络请求,无论缓存状态如何 来源refetch() -
使用属性声明式处理横切关注点——为查询附加元数据,以便在
meta中驱动全局UI行为(如提示消息)来源PiniaColadaQueryHooksPlugin -
在执行乐观回滚前验证缓存状态——务必在中检查当前缓存值是否与乐观更新值匹配,以避免覆盖其他变更发起的并发成功更新 来源
onError
ts
onError(err, vars, { newTodo, oldTodo }) {
if (newTodo === queryCache.getQueryData(['todos'])) {
queryCache.setQueryData(['todos'], oldTodo)
}
}-
使用进行手动状态同步——这是手动更新条目的推荐方式,因为通过
queryCache.setEntryState()将数据设置为setQueryData()不再支持状态重置 来源undefined -
在Nuxt的定义中显式从
defineQuery导入vue-router——Nuxt的自动导入版本可能会因Suspense集成导致不必要的查询触发或useRoute值 来源undefined -
在全局Store中使用getter保护“永久”查询——当所需的响应式参数(如路由参数)不存在时,防止Pinia Store中的查询发起无效网络请求 来源
enabled
ts
const result = useQuery({
key: () => ['deck', route.params.id],
query: () => fetchDeck(route.params.id),
enabled: () => !!route.params.id,
})