Pinia 快速上手
引入 Pinia
1 |
|
创建 Store
创建 src/stores/index.ts
:
1 |
|
- Pinia 抛弃了 Vuex 的嵌套 Store 和 module,直接支持多 Store,因此文件夹命名为
stores
而不是store
。同时与 Vuex 使用不同的命名有利于 Vuex 的项目向 Pinia 平滑迁移。 defineStore
第一个参数是 Store 的 id,必须唯一。defineStore
返回的是一个函数,通过调用达到类似 Vuex 中useStore
的效果。- Store 函数的命名一般为
useIdStore
。 getters
是 Store 的计算属性。- Pinia 的
actions
支持同步和异步。 hydrate
用于 SSR。
使用 State
1 |
|
1 |
|
从 useIdStore
函数的返回值上可以访问到该 Store。
如果你想在 Options API 中使用 Store,可以使用 setup
钩子:
1 |
|
如果你不了解 Composition API 或 setup
钩子,记住 setup
钩子的返回内容将被暴露在组件实例上,因此你可以在 Options API 中这样使用:this.todo
。
解构 Store
解构赋值使得在使用变量的时候更方便,但 Store 不能随便解构,否则会失去响应性而变成一个单纯的值变量。
如果需要解构 store,需要使用 storeToRefs
:
1 |
|
由于该 API 会使用 ref
包装解构出来的值,因此使用的时候需要遵循 ref
的方法:使用 todo.value
来访问到包装里的值。因此,对 Store 解构并不总是会简化代码。
修改 State
直接修改
与 Vuex 不同,你可以直接在 Store 实例上对 State 进行修改而不需要创建一个 mutation,Pinia 将会自动完成 mutation 的创建。
1 |
|
$patch
如果你需要同时修改多个 State,那么 $patch
是一个很好的选择。
1 |
|
$patch
中传入的对象将被合并到 State 对象中。
另外,如果要对 State 中的数组进行 push 等操作,$patch
还接受一个 patch 函数,可以在 patch 函数中对 State 进行修改。
1 |
|
替换 State
可以更改 Store 实例上的 $state
属性实现对整个 State 进行替换:
1 |
|
重置 State
可以通过 Store 实例上的 $reset
方法将 State 重置为初始值:
1 |
|
订阅 State
通过 Store 实例上的 $subscribe
方法订阅 State 的变化,相当于 State 的 watch
:
1 |
|
mutation
有如下属性:
type
:mutation 类型,值为direct
或patch object
或patch function
storeId
:Store 的 idpayload
:仅在patch object
时有效 此对象是传递给 $patch 的对象
创建 Getter
Getter 相当于 State 的计算属性,其使用方式与 Options API 中定义计算属性类似:
1 |
|
Pinia 支持在 Getter 中使用 this
访访问 Store 实例,但此时会导致 TypeScript 不能推导返回值类型,需要显式定义返回值类型:
1 |
|
使用 Getter
你可以像直接使用 State 一样访问 Getter:
1 |
|
访问其他 Getter
由于在 Getter 中可以使用 this
访问 Store 实例,因此你也可以在 this
中直接访问其他 Getter。
创建 Action
虽然 Pinia 支持直接修改 State,但如果有一些复杂的、只与 State 有关的业务逻辑,还是建议封装到 Action 中。
1 |
|
要使用 Action,直接在 Store 实例上调用即可。
1 |
|
异步 Action
Pinia 中不像 Vuex 一样同步和异步的方法分别在 mutations 和 actions 中,Pinia 的 Action 同时支持同步与异步。下面是异步 Action 的示例:
1 |
|