官网地址:
https://pinia.vuejs.org/
     文章目录
    
    
    
    1、Pinia 介绍
   
     
   
一个全新的用于 Vue 的状态管理库。下一个版本的 Vuex,也就是 Vuex 5.0。
- 
     
 Pinia
 
 最初是一个
 
 实验
 
 ,目的是在2019年11月左右重新设计 Vue 状态管理在
 
 Composite API
 
 上的样子,也就是下一代 Vuex:- 
       之前的Vuex主要服务于Vue2,
 
 Options API
 
- 如果想要在Vue3中使用Vuex,需要使用 4.x 版本:只是一个过渡的选择,还有很大的缺陷
- 
       所以在Vue3伴随着
 
 Composition API
 
 诞生之后,也设计了全新的Vuex:Pinia,也就是Vuex5
 
- 
       之前的Vuex主要服务于Vue2,
    
    
    ① 核心特性
   
- Vue2和Vue3都支持
- 除了初始化安装和SSR配置之外,两者的API都是相同的:官方文档中主要针对Vue3进行说明,必要的时候会提供Vue2的注释
- 支持VueDevTools
- 跟踪actions、mutations的时间线:在使用容器的组件中就可以观察到容器本身
- 
     支持time travel (时间旅行) 更容易的调试功能:在Vue2中Pinia使用Vuex的现有接口,
 
 所以不能与Vuex一起使用
 
- 但是针对Vue3中的调试工具支持还不够完美,比如还没有time-travel调试功能
- 模块热更新
- 无需重新加载页面即可修改您的容器:热更新的时候保持任何现有状态
- 支持使用插件扩展Pinia功能
- 相比Vuex有更好完美的TypeScript支持
- 支持服务端渲染
    
    
    ② 核心概念
   
- Pinia从使用角度和之前的Vuex几乎是一样的,比Vuex更简单了。
- 
     在Vuex中有四个核心概念:
 
 State、Getters、Mutations、Actions
 
- 
     在Pinia中:
 
 State、Getters、Actions (同步异步都支持)
 
- 
     Store(如 Pinia)是一个保存状态和业务逻辑的实体,它不绑定到您的组件树。换句话说,
 
 它承载全局 state
 
 。它有点像一个始终存在的组件,每个人都可以读取和写入。它有
 
 三个核心概念
 
 。
    
    
    Ⅰ. state
   
    
     类似组件的
    
    
     
      data
     
    
    
     ,用来存储全局状态
    
   
{
  todos: [
    { id: 1, title: '吃饭', done: false },
    { id: 1, title: '吃饭', done: true },
    { id: 1, title: '吃饭', done: false }
  ]
}
    
    
    Ⅱ. getters
   
    
     类似组件的
     
      
       
        computed
       
      
     
     ,根据已有 State 封装派生数据,也具有缓存的特性
    
   
doneCount () {
  return todos.filter(item => item.done).length
}
    
    
    Ⅲ. actions
   
    
     类似组件的
     
      
       
        methods
       
      
     
     ,用来封装业务逻辑,同步异步都可以
    
    ;在 Vuex 中同步操作用 mutations,异步操作用 actions,太麻烦!!!
   
    
    
    Ⅳ.
    
     提示:Pinia 中没有 mutations。
    
   
    
    
    ③ 基本示例
   
- 
这就是在 API 方面使用 pinia 的样子(请务必查看 
 
 入门
 
 以
 
 获取
 
 完整说明)。您首先创建一个 store:// stores/counter.js import { defineStore } from 'pinia' export const useCounterStore = defineStore('counter', { state: () => { return { count: 0 } }, // could also be defined as // state: () => ({ count: 0 }) actions: { increment() { // 在 Vuex 中我们需要搞两步:1. 定义 mutations 2. 提交 mutations this.count++ }, }, })
- 
然后在组件中使用它: import { useCounterStore } from '@/stores/counter' export default { setup() { const counter = useCounterStore() counter.count++ // with autocompletion ✨ counter.$patch({ count: counter.count + 1 }) // or using an action instead counter.increment() }, }
- 
您甚至可以使用函数(类似于组件 
 
 setup()
 
 )为更高级的用例定义 Store:export const useCounterStore = defineStore('counter', () => { const count = ref(0) function increment() { count.value++ } return { count, increment } })
- 
如果你仍然不 
 
 熟悉
 
 
 setup()
 
 Composition API,别担心,Pania 也支持类似
 
 Vuex 的
 
 一组
 
 
 地图助手
 
 
 。您以相同的方式定义商店,但随后使用
 
 mapStores()
 
 ,
 
 mapState()
 
 ,或
 
 mapActions()
 
 :const useCounterStore = defineStore('counter', { state: () => ({ count: 0 }), getters: { double: (state) => state.count * 2, }, actions: { increment() { this.count++ } } }) const useUserStore = defineStore('user', { // ... }) export default { computed: { // other computed properties // ... // gives access to this.counterStore and this.userStore ...mapStores(useCounterStore, useUserStore) // gives read access to this.count and this.double ...mapState(useCounterStore, ['count', 'double']), }, methods: { // gives access to this.increment() ...mapActions(useCounterStore, ['increment']), }, }
- 
您将在核心概念中找到有关每个 
 
 地图助手的
 
 更多信息。
    
    
    ④ Pinia vs Vuex
   
- 
     Pinia试图尽可能接近Vuex的理念。它旨在测试Vuex下一次迭代的提案,并且取得了成功,因为我们目前有一个针对Vuex5的开放式 RFC,
 
 其API与
 
 Pinia使用
 
 的 API 非常相似
 
 。请注意,Pinia的作者I (Eduardo) 是Vue.js核心团队的一员,并积极参与Router和Vuex等API的设计。我个人对这个项目的意图是重新设计使用全局Store的体验,同时保持 Vue 平易近人的哲学。我让Pania的API与Vuex一样接近,因为它不断向前发展,使人们可以轻松地迁移到Vuex,甚至在未来融合这两个项目(在Vuex下)。
- 
     关于版本问题:
- Vuex 当前最新版本是 4.x
- Vuex 4 用于 Vue 3
- Vuex 3 用于 Vue 2
- Pinia 当前最新版本是 2.x
- 既支持 Vue 2 也支持 Vue 3
 
- 
     Pinia 可以认为就是 Vuex 5,因为它的作者是官方的开发人员,并且已经被官方接管了。
- 
       有两种可能(个人猜测):
- 把 Pinia 合并到 Vuex 中作为 Vuex 5.x
- 两个仓库独立发展,官方会推荐使用 Pinia
 
 
- 
       有两种可能(个人猜测):
- 我给大家的建议就是:可以直接去使用 Pinia。
- 
     Pinia API 与 Vuex ≤4 有很大不同,即:
- 
       
 没有
 
 
 
 mutations
 
 
 。mutations 被认为是非常冗长的。最初带来了 devtools 集成,但这不再是问题。
- 
       
 不再有模块的嵌套结构。
 
 您仍然可以通过在另一个 store 中导入和使用 store 来隐式嵌套 store,但 Pinia 通过设计提供扁平结构,同时仍然支持 store 之间的交叉组合方式。您甚至可以拥有 store 的循环依赖关系。
- 
       
 更好
 
 typescript
 
 支持。
 
 无需创建自定义的复杂包装器来支持 TypeScript,所有内容都是类型化的,并且 API 的设计方式尽可能地利用 TS 类型推断。
- 
       
 不再需要注入、导入函数、调用它们,享受自动补全!
 
- 
       
 无需动态添加 stores,默认情况下它们都是动态的,您甚至不会注意到。
 
 请注意,您仍然可以随时手动使用 store 来注册它,但因为它是自动的,所以您无需担心。
- 
       
 没有命名空间模块。
 
 鉴于 store 的扁平架构,“命名空间” store 是其定义方式所固有的,您可以说所有 stores 都是命名空间的。
 
- 
       
- Pinia 就是更好的 Vuex,建议在你的项目中可以直接使用它了,尤其是使用了TypeScript 的项目。
    
    
    ⑤ 关于名字
   
- 
     Pinia(发音
 
 /peenya/
 
 为英语)是最接近
 
 piña
 
 (西班牙语中的
 
 pineapple
 
 )的词,它是一个有效的包名。菠萝实际上是一组独立的花朵,它们结合在一起形成多种水果。与 stores 类似,每家 store 都是独立诞生的,但最终都联系在一起。它也是一种原产于南美洲的美味热带水果。
    
    
    ⑥ 关于作者
   
     
   
 
