南宫NG·28(中国)相信品牌力量/Vue 3 中的状态管理 —— 从 Vuex 到 Pinia 的全面过渡
南宫NG·28(中国)相信品牌力量【罔丨止:MGTY.PW】 点击此处复制到浏览器打开
在 Vue 项目中,组件间数据共享是常见需求。Vuex 是过去的主力方案,而在 Vue 3 生态下,Pinia 正式成为推荐状态管理库。本课将带你了解两者的区别,并用 Pinia 构建实际应用的共享状态。
一、Pinia 是什么?
Pinia 是 Vue 官方推出的轻量状态管理库,支持组合式 API、类型推导、热更新等特性,被视为 Vuex 的替代品。
优点包括:
-
与 Vue 3 无缝集成
-
写法更简洁,使用体验更现代
-
支持模块化和持久化扩展
-
默认支持 devtools 调试
二、安装与配置
bash
复制编辑
npm install pinia
在 main.js
中注册:
https://blog.csdn.net/yibuAPI12/article/details/148902253?0625https://blog.csdn.net/yibuAPI12/article/details/148903853?0625https://blog.csdn.net/yibuAPI12/article/details/148904006?0625https://blog.csdn.net/yibuAPI12/article/details/148904471?0625https://blog.csdn.net/yibuAPI12/article/details/148904836?0625https://blog.csdn.net/yibuAPI12/article/details/148904873?0625https://blog.csdn.net/yibuAPI12/article/details/148904901?0625https://blog.csdn.net/yibuAPI12/article/details/148905070?0625https://blog.csdn.net/yibuAPI12/article/details/148905225?0625https://blog.csdn.net/yibuAPI12/article/details/148905296?0625https://blog.csdn.net/2501_91176835/article/details/148905751https://blog.csdn.net/2501_91176835/article/details/148906078
js
复制编辑
import { createApp } from 'vue' import App from './App.vue' import { createPinia } from 'pinia' const app = createApp(App) app.use(createPinia()) app.mount('#app')
三、创建一个 Store
在 src/stores/counter.js
中创建:
js
复制编辑
import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), actions: { increment() { this.count++ } } })
四、在组件中使用 Store
vue
复制编辑
<template> <div> <p>当前计数:{{ counter.count }}</p> <button @click="counter.increment">增加</button> </div> </template> <script setup> import { useCounterStore } from '@/stores/counter' const counter = useCounterStore() </script>
无需手动注入,Pinia 自动响应式,非常适合组合式 API 用户。
五、Getter 与派生状态
js
复制编辑
getters: { double: (state) => state.count * 2 }
在组件中直接读取 counter.double
即可。
六、模块化管理多个 Store
你可以按业务拆分多个 Store:
js
复制编辑
// userStore.js export const useUserStore = defineStore('user', { state: () => ({ username: '', token: '' }), actions: { login() { /* 登录逻辑 */ } } })
这种方式避免了 Vuex 中繁琐的命名空间写法。
七、Pinia vs Vuex 简单对比
对比项 | Pinia | Vuex |
---|---|---|
API 风格 | 组合式 | 选项式 |
TS 支持 | 极佳(自动推导) | 较复杂 |
模块化 | 简单直接 | 需要命名空间配置 |
学习成本 | 较低 | 略高 |
是否推荐 | ✅ 官方推荐 | ❌ 不再是主力推荐 |