Pinia 是 Vue 官方推荐的状态库:去掉 mutation,直接在 action 里改 state;模块不再用命名空间嵌套,每个 store 是独立的 defineStore 单元,按需引入;对 TypeScript 几乎零配置就有完整推导,同时支持组合式与选项式两种定义风格,体积仅约 1KB。
对比 Vuex:mutation/action 两层是 Flux 的遗留约束,实践中大多冗余;Pinia 的 action 直接提交状态,devtools 依然可追踪时间旅行。store 之间可互相引用,也能在组件外使用。易错点:解构 store 会丢响应式,要用 storeToRefs;$reset 只存在于选项式定义的 store;SSR 下每个请求要创建独立 pinia 实例防止状态串请求。追问:与 Zustand、Redux Toolkit 的设计对比、什么场景根本不需要全局 store。
export const useUser = defineStore('user', () => {
const name = ref('')
async function login() { name.value = await api.login() }
return { name, login }
})