vue3官方指定状态管理工具——Pinia
前言
在 2020 年 9 月 Vue 3 发布正式版本之后,2021 年 2 月 Vuex 也发布了适配 Vue 3 的 4.0 版本,但是在 2021 年 8 月底,由 Vue 核心团队成员 Eduardo 主要贡献的全新 Vue 状态共享库发布 2.0 版本,并在同年 11 月,尤大正式指定 Pinia 为 Vue 的官方状态库(现在 Vue 官网也已经将 Vuex 替换为了 Pinia)。
什么是 Pinia
Pinia 是一个用于 Vue.js 应用程序的状态管理库。它提供了一种集中式存储应用状态的方式,使得状态管理更加结构化和易于维护。
想象一下,你是一家餐厅的厨师长。这家餐厅有很多菜品(就像应用程序中有许多组件),每个菜品都有自己的配料和制作步骤(如同组件中的局部状态和逻辑)。但是,有些配料是所有菜品共用的,比如盐、胡椒、油等(这就好比是应用中共享的状态)。如果每次做新菜都要重新准备这些基本配料,那效率就会很低下,而且容易出错。
为了解决这个问题,你可以设立一个中央厨房仓库(相当于 Pinia store),这里集中存放所有的基础配料,并由专人负责管理这些资源。这样,当各个厨师需要这些配料时,他们只需要从中央仓库领取即可,不需要各自再单独准备。这个过程不仅提高了效率,还保证了配料的一致性和质量控制(例如确保所有菜品使用的盐都是同一品牌)。
此外,如果某个菜品突然非常受欢迎,导致某种配料的需求量大增,中央仓库可以迅速调整库存,甚至提前预测并补充相关物资(类似于在应用程序中响应用户行为或网络请求来更新共享状态)。
通过这种方式,Pinia 作为 Vue 应用的状态管理层,帮助开发者解决了以下问题:
- 状态一致性:确保不同组件间共享的数据是一致且最新的。
- 可维护性:使代码更易于理解和维护,尤其是对于大型项目。
- 性能优化:减少不必要的数据传递和计算,提高应用性能。
- 开发体验:提供简洁易用的 API 和良好的 TypeScript 支持,改善开发者的编写体验。
Pinia 为何能取代 Vuex
取消 mutations。因为在大部分开发者眼中,mutations 只支持 同步修改状态数据,而 actions 虽然支持 异步,却依然要在内部调用 mutations 去修改状态,无疑是非常繁琐和多余的
所有的代码都是 TypeScript 编写的,并且所有接口都尽可能的利用了 TypeScript 的 类型推断,而不像 Vuex 一样需要自定义 TS 的包装器来实现对 TypeScript 的支持
不像 Vuex 一样需要在实例/Vue原型上注入状态依赖,而是通过直接引入状态模块、调用 getter/actions 函数来完成状态的更新获取;并且因为自身对 TypeScript 的良好支持和类型推断,开发者可以享受很优秀的代码提示
不需要预先注册状态数据,默认情况下都是根据代码逻辑自动处理的;并且可以在使用中随时注册新的状态
没有 Vuex 的 modules 嵌套结构,所有状态都是扁平化管理的。也可以理解为 pinia 注册的状态都类似 vuex 的 module,只是 pinia 不需要统一的入口来注册所有状态模块
虽然是扁平化的结构,但是依然支持 每个状态之间的互相引用和嵌套
不需要 namespace 命名空间,得利于扁平化结构,每个状态在注册时即使没有声明状态模块名称,pinia 也会默认对它进行处理