Pinia🍍🍍🍍🍍🍍(状态管理器)

269 阅读2分钟

1. 介绍

pinia状态管理器用于前端全局获取信息,与Vuex相比很类似,但更简易(除去了mutations)。 通过资源管理器工具(yarn)输入命令yarn add pinia安装插件。

import { createPinia } from 'pinia'

const pinia = createPinia()

2. 参数

  1. state用于存放数据的地方,通过箭头函数返回
  2. getters定义计算关系的地方
  3. actions定义方法的地方
  4. persist设置数据持久化的属性

下面定义了一个名叫useCommon的状态管理器

import { defineStore } from "pinia"

export const useCommon = defineStore('useCommon', {
    // 数据
    state: () => {
        return {
            
        }
    },
    // 计算
    getters: {

    },
    // 方法
    actions: {
        
    },
    persist: {
        
    }
})

3. 持久化

pinia所管理的数据其实也相当于静态数据,它定义在前端代码中,在页面中某处展示时,如果用户修改获取到的state中的值并刷新页面,发现数据会变回到它最开始定义的状态。因此如果想将修改的值代替原来定义的值,并且刷页面也不会再回到定义的状态,就需要开启持久化操作,将数据保存到浏览器中。通过资源管理器工具(yarn)输入命令yarn add pinia-plugin-persistedstate安装插件。

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

persist属性配置

  1. 设置enabled属性为true开启持久化操作
  2. 设置storage属性为sessionStorage/localStorage将数据存储在浏览器的session或local中
  3. 设置key属性为state数据存储在浏览器Storage的key自定义命名
persist: {
    enabled: true,
    storage: sessionStorage,
    // storage: localStorage
    // key: 'local'
}

关于持久化时的两个问题

  1. 需修改state中的值,才能将state数据存入浏览器中
  2. sessionStorage不支持跨标签页共享数据,localStorage支持跨标签页共享数据

4. 使用

这里我们继续以useCommon来命名一个状态管理器,并向state中添加一个time值

import { defineStore } from "pinia"

export const useCommon = defineStore('useCommon', {
  // 数据
  state: () => {
    return {
      time: '2023-4-26'
    }
  },
  // 计算
  getters: {

  },
  // 方法
  actions: {
    update(val) {
      this.time = val
    }
  },
  persist: {
    enabled: true,
    storage: sessionStorage
  }
})

现在我们开始使用useCommon状态管理器,并分享一些经验

<script lang="ts" setup>
import { computed, ref } from "vue";
import { useCommon } from "@/..";

// 通过computed实时获取state数据(只要state中发生变化,获取的数据state也会同步更新)
let getTime = computed(() => useCommon().time);
const time = ref(getTime);
//console.log(time.value); // 2023-4-26

// 修改state的值
// 因为上面使用computed获取值,因此我们可以直接修改,修改后的值在state中也会更新
// 直接修改适用于组合式(setup)编程
time = '2023-5-3'
//console.log(time.value); // 2023-5-3

// 如果没有使用computed获取值或者不想直接修改,可以在状态管理器的actions中定义一个方法(update())
// 间接直接修改适用于分布式编程
function useUpdate() {
   useCommon().update('2023-5-19');
}
//console.log(time.value); // 2023-5-19
</script>