刚转到 Vue 3 那会儿,我还挣扎着继续用 Vuex 4,但写起 TS 类型来简直痛不欲生。后来尤大亲自推荐了 Pinia,试了一下发现,没了 Vuex 里那恶心的 mutations,代码写起来真是清爽太多了。
时间久了有些用法容易忘,这里把平时项目里最顺手的几种写法整理下来。
1. 为啥不用 Vuex 了?
简单来说,Pinia 最大的爽点有这几个:
- 没有 Mutations 了:以前改个数据,得先写个 action,再去触发 mutation,现在直接写个函数改 state 就行。
- TS 支持极好:不用自己绞尽脑汁去定义什么大全局类型,它自动能推导出来。
- 没啥花里胡哨的模块嵌套:以前那套带 namespace 的 module 让人头晕,现在就是一个文件一个 store,想互相用直接引。
2. 安装和挂载
标准的套路:
1 | npm install pinia |
去 main.js 里插进去:
1 | import { createApp } from 'vue' |
3. 写法一:像写 Vuex 一样的 Option 风格
如果你怀念以前的写法,可以这样写:
1 | // stores/counter.js |
4. 写法二:强烈推荐的 Setup 风格
这个跟 Vue3 的 setup 语法一脉相承,用熟了特别自然:
1 | // stores/user.js |
5. 组件里怎么用?
这也是个容易踩坑的地方,如果你直接把属性解构出来,它就失去响应式了(跟 props 一样)。
1 | <script setup> |
6. 其他几个常用的小技巧
批量改状态($patch)
如果要同时改好几个状态,直接用 $patch 性能会好一点(只触发一次视图更新):
1 | const store = useCounterStore() |
本地存储持久化插件
以前手写 localStorage,现在推荐装个插件 pinia-plugin-persistedstate,一行配置就能让页面刷新数据不掉。
1 | export const useSettingsStore = defineStore('settings', () => { |
总体来说,Pinia 这个轮子确实好用,没什么上手难度,现在写 Vue3 没它感觉都不会写代码了。
评论加载中…