初试pinia
Pinia 是什么?
- Pinia 是一个用于 Vue 的状态管理库,类似 Vuex, 是 Vue 的另一种状态管理方案
- Pinia 支持 Vue2 和 Vue3
本文只讲 Pinia 在 Vue3 中的使用, 在 Vue2 中使用略有差异,参考 官方文档
Pinia 优势
- 符合直觉,易于学习
- 极轻, 仅有 1 KB
- 模块化设计,便于拆分状态
安装 Pinia
安装需要 @next 因为 Pinia 2 处于 beta 阶段, Pinia 2 是对应 Vue3 的版本
使用 npm
1 | npm install pinia@next |
使用 yarn
1 | yarn add pinia@next |
创建一个 pinia(根存储)并将其传递给应用程序:
1 | import { createPinia } from 'pinia'; |
核心概念与基本使用
Store
Store 是一个保存状态和业务逻辑的实体,可以自由读取和写入,并通过导入后在 setup 中使用
创建一个 store
1 | // store.js |
使用 Store
1 | // xxx.vue |
Getters
Pinia 中的 Getters 作用与 Vuex 中的 Getters 相同,但使用略有差异
Pinia 中的 Getters 直接在 Store 上读取,形似 Store.xx,就和一般的属性读取一样
Getter基本使用
- Getter 第一个参数是 state,是当前的状态,也可以使用 this.xx 获取状态
- Getter 中也可以访问其他的 Getter, 或者是其他的 Store
1 |
|
actions
Pinia 没有 Mutations,统一在 actions 中操作 state,通过this.xx 访问相应状态
虽然可以直接操作 Store,但还是推荐在 actions 中操作,保证状态不被意外改变
action 和普通的函数一样
action 同样可以像 Getter 一样访问其他的 Store,同上方式使用其它 Store,这里不在赘述,详细请移步 官方文档
Actions
action 基本使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// store.js
export const useStore({
state: ()=> ({
count: 2,
// ...
})
// ...
actinos: {
countPlusOne() {
this.count++;
},
countPlus(num) {
this.count += num;
}
}
})总结
Pinia 相比 Vuex 更加简单,而且 Pinia 可以自由扩展 官方文档 Plugins
Pinia 是符合直觉的状态管理方式,让使用者回到了模块导入导出的原始状态,使状态的来源更加清晰可见
Pinia 的使用感受类似于 Recoil,但没有那么多的概念和 API,主体非常精简,极易上手(Recoil 是 Facebook 官方出品的用于 React 状态管理库,使用 React Hooks 管理状态)
Pinia 2 目前还在 Beta 状态,不建议在生产环境中使用,不过相信稳定了以后会成为 Vue 生态中另一大状态管理方案