Pinia (发音为 /piːnjʌ/)支持 Vue 3 和 Vue 2 ,对 TypeScript 也有很完好的支持,与 Vuex
相比,Pinia
提供了一个更简单的 API,提供了 Composition-API
风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持。
状态管理弃用了 vuex 而采用Pinia 的 5个重要条件:
Pinia API 与 Vuex ≤4 有很大不同,即:
mutations 不再存在
。他们经常被认为是非常冗长。他们最初带来了 devtools 集成,但这不再是问题。不再有 modules 的嵌套结构
。您仍然可以通过在另一个 Store 中导入和 使用 来隐式嵌套 Store,但 Pinia 通过设计提供平面结构,同时仍然支持 Store 之间的交叉组合方式。 您甚至可以拥有 Store 的循环依赖关系。没有命名空间模块
。鉴于 Store 的扁平架构,“命名空间” Store 是其定义方式所固有的,您可以说 所有 Store 都是命名空间的。有关如何将现有 Vuex ≤4 项目转换为使用 Pinia 的更详细说明,请参阅 从Vuex 迁移指南。
状态树的结构
作用 | Vue Component | Vuex | Pinia |
---|---|---|---|
数据管理 | data | state | state |
数据计算 | computed | getters | getters |
行为方法 | methods | mutations / actions | actions |
可以看到 Pinia 的结构和用途都和 Vuex 与 Component 非常相似,并且 Pinia 相对于 Vuex ,在行为方法部分去掉了 mutations (同步操作)和 actions (异步操作)的区分
,更接近组件的结构,入门成本会更低一些。
https://uniapp.dcloud.net.cn/tutorial/vue3-pinia.html
注意
uni-app 内置了 Pinia 。Vue 2 项目暂不支持。 HBuilder X 已内置了 Pinia,无需手动安装。
项目结构
├── pages
├── static
└── stores
└── common.js
├── App.vue
├── main.js
├── manifest.json
├── pages.json
└── uni.scss
在 main.js
中编写以下代码:
import App from './App'
import { createSSRApp } from 'vue';
import * as Pinia from 'pinia';
export function createApp() {
const app = createSSRApp(App);
app.use(Pinia.createPinia());
return {
app,
Pinia, // 此处必须将 Pinia 返回
};
}
首先创建一个 Store:
import {
defineStore
} from 'pinia';
export const useCommonStore = defineStore('common', {
state: () => {
return {
count: 0,
cityName: "郑州"
};
},
actions: {
increment() {
this.count++;
},
},
});
使用
import { useCommonStore } from '@/stores/common';
import { mapState, mapStores, mapActions } from 'pinia'
export default {
computed: {
// 允许访问 this.commonStore
...mapStores(useCommonStore),
// 允许读取 this.count 和 this.cityName
...mapState(useCommonStore, ['count', 'cityName']),
},
methods: {
// 允许读取 this.increment()
...mapActions(useCommonStore, ['increment']),
},
}
赋值
this.commonStore.cityName = '全国';