Pinia相关知识点

Pinia 是 Vue 的存储库,它支持vue2和vue3。因此在写项目中,我们可以使用pinia代替vuex,就我个人而言,我觉得pinia使用起来方便的多。

与 Vuex 相比,Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持。

具体差异和Pinia优势查看Pinia官网: Pinia 中文文档

基于vue3

Store仓库配置文件结构及说明:

import { defineStore } from 'pinia'

// useStore 可以是 useUser、useCart 之类的任何东西
// 第一个参数是应用程序中 store 的唯一 id
export const useStore = defineStore('main', {
  state:()=>{ //数据存放在函数返回值对象中
    return {
        msg:"第一次使用pinia",
        number:10
    }
  },
  getters:{//相当于计算属性
    em:(state)=>{ //形参中能够接收到数据
    
    }
  },
  actions:{
    //处理程序
   // 写声明式函数时可以使用this,也能获取到state内的数据,如:
    add(){
        this.number+1
    },
    //也可以在形参中接收到state,如:
    add1(state){
        state.number+1
    }
  }
})

其它的配置自行查照文档。

修改state状态

接下来讲一下,在组件中如何修改state中的值。

1、直接引入store,并进行修改,如store.msg="**",store是一个响应性对象 因此可以修改并刷新

<script setup>

    import { useStore } from '../store/index.js'

    let Store=useStore()

    // 1、直接修改

    let change1=()=>{ //触发这个函数时修改

        Store.msg="修改1"

    }

</script>

2、在使用时,我们有时不想Store.msg取值。我们一般就是解构赋值取出每一项;如果我们取出store的数据后再修改取出的这个值,不再具备响应式,因此我们还需要用到toRefs处理

<script setup>

    import { useStore } from '../store/index.js'

    import { toRefs } from "vue";

    let Store=useStore()

    //  //2、单独导出时利用toRefs把响应式对象的属性解构为响应性的变量

         let change2=()=>{

        let {msg}=toRefs(Store)

        msg.value="修改2"

    }

</script>

3、Pinia提供的方法,store.$reset()将状态 重置为初始值,无论我们怎么修改store仓库的值,只要我们代码运行store.$reset()后就恢复到初始状态。

4、Pinia提供的方法,store.$patch()修改数据,可以同时修改多条数据,传入的参数有两种情况:1、对象形式  2、函数

对象形式:根据对应的属性名去修改state中的数据

let change4=()=>{ 

        Store.$patch({

            number:1,

            msg:"666"

        })

    }

修改原则:我们传入对象的属性名与state内属性名对应才去覆盖,如果属性名不对应那就不会生效,虽然会加到state中,但是我们不能在页面使用。

函数形式: 传入对象这种应用某些突变非常困难或代价高昂:任何集合修改(例如,从数组中推送、删除、拼接元素)都需要您创建一个新集合。 正因为如此,$patch 方法也接受一个函数来批量修改集合内部分对象的情况:

let change5=()=>{

        Store.$patch((state)=>{//形参中可以接收到state

            state.number=1

            state.msg="666"

        })

    }

以函数形式修改,为什么不直接在外部Store点属性的方式修改呢?

Store. $patch 的方式修改时,状态只会刷新一次,可以批量修改。

5、替换state

 //store将其 $state 属性设置为新对象来替换 Store 的整个状态

Store.$state = { number: 666, name: 'Paimon' }

订阅状态

Pinia给我们提供了一个$subscrible方法来查看状态及其变化,当我们state中数据发生改变后这个方法就会触发,使用 $subscrible() 的优点是 subscriptions 只会在 patches 之后触发一次

写法:

 Store.$subscribe((mutation, state) => {

       //处理程序

        console.log(mutation,state);

})

其中mutation参数对象中包含三个参数:

1、storeId 值为当前Store仓库的ID

2、type 值为修改的形式,如直接修改就是direct ,通过$patch修改的值为patch object或patch function

3、events 值中保存了修改前后对应的数据

如果是$patch方法通过传入对象修改时,还会多一个属性payload,里面存放的是传入的对象

第二个参数:state表示状态更新后,Store中的state