Pinia是 Vue 的存储库,它允许您跨组件/页面共享状态,与vuex功能一样。
官网解释:Pinia 最初是为了探索 Vuex 的下一次迭代会是什么样子,结合了 Vuex 5 核心团队讨论中的许多想法。最终,我们意识到 Pinia 已经实现了我们在 Vuex 5 中想要的大部分内容,并决定实现它 取而代之的是新的建议。
与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持。
Pinia API 与 Vuex ≤4 有很大不同,即:
- yarn add pinia
- # 或者使用 npm
- npm install pinia
语法: defineStore(仓库id,( )=>{
const x = 1
})
- import { ref, computed } from "vue";
- import { defineStore } from "pinia";
-
- export const useCounterStore = defineStore("counter", () => {
- const count = ref(0);
- const doubleCount = computed(() => count.value * 2);
- function increment() {
- count.value++;
- }
-
- return { count, doubleCount, increment };
- });
可以在方法内定义变量、方法(包括异步同步),书写起来和Composition API几乎一样,如果页面要使用记得return出变量或方法,如果你不熟悉Composition API 可参考 vue使用pinia (vue2/vue3) 其他使用方式
由于 pinia不再有modules 如果想定义其他仓库,可新建相同文件格式,注意要更换仓库id
3.main.ts
- import { createApp } from 'vue'
- import { createPinia } from 'pinia'
- import persist from 'pinia-plugin-persistedstate' //持久化插件
- const app = createApp(App)
- app.use(createPinia().use(persist))
这也是vite构建工具提供给我们的例子
如果你要持久化 需要安装插件 若不需要则不需引入
- pnpm i pinia-plugin-persistedstate
- # or
- npm i pinia-plugin-persistedstate
- # or
- yarn add pinia-plugin-persistedstate
1.store/index.ts
概述 main.ts里的createPinia 直接在store里面做,包括引入持久化插件 省去main.ts的冗余 (它能做的我也能做)
- import { createPinia } from 'pinia'
- import persist from 'pinia-plugin-persistedstate' //导入持久化插件
-
- // 创建pinia实例
- const pinia = createPinia()
- // 使用pinia插件
- pinia.use(persist)
- // 导出pinia实例,给main使用
- export default pinia
- export * from './user' //多个模块同理导出
-
2.store/user.ts
单纯举个模板例子
- import type { User } from '@/types/user'
- import { defineStore } from 'pinia'
- import { ref } from 'vue'
-
- export const useUserStore = defineStore('cp-user', () => {
- // 用户信息
- const user = ref<User>()
- // 设置用户,登录后使用
- const setUser = (u: User) => {
- user.value = u
- }
- // 清空用户,退出后使用
- const delUser = () => {
- user.value = undefined
- }
- return { user, setUser, delUser }
- }, {
- persist:true // 开启持久化
- })
3.main.ts
- import { createApp } from 'vue'
- import pinia from './stores'
- import App from './App.vue'
- app.use(pinia)
- app.mount('#app')
4. 使用
- import { useUserStore } from '@/stores'
- const store = useUserStore()
调用出来的 store 就是当前仓库的数据啦,直接store.变量/方法 即用
