当多个组件(且非父子关系)需要共享同一份数据——用户登录状态、购物车、全局主题——靠 props 逐层传递会失控,状态库把它抽到一个全局单例。Pinia 是 Vue 官方在 Vue 3 时代的答案(取代 Vuex):完全基于组合式 API,store 用 defineStore 定义,state/getters/actions 概念更直观。
相对 Vuex 的进步:没有 mutations(mutations 是 Vuex 同步提交的设计负担)、天然 TypeScript 支持、支持模块化按需引入、DevTools 时间旅行调试一应俱全。store 可拆成多个小 store,组合性极强。
<!-- stores/user.js --> import { defineStore } from 'pinia'; import { ref, computed } from 'vue'; // 组合式风格的 store export const useUserStore = defineStore('user', () => { const token = ref(''); // state const isLogin = computed(() => !!token.value); // getter async function login(u, p) { // action(可异步) token.value = await api.login(u, p); } return { token, isLogin, login }; }); <!-- 组件使用 --> <script setup> import { useUserStore } from '../stores/user'; const user = useUserStore(); if (user.isLogin) user.login('a', 'b'); // 像组合式函数一样自然 </script>