Skip to content

pinia使用

Pinia提供了一个简单、灵活和高效的方式来管理Vue 3应用程序中的状态。

安装

sh
npm install pinia

创建pinia实例并在main.js中挂在

js
import { createPinia } from 'pinia'
const pinia = createPinia()

// main.js
app.use(pinia)

counter 示例

js
// store/counter.js
import { ref, computed } from "vue";
import { defineStore } from "pinia";
// 选项式写法
export const useCounterStore = defineStore(
  "counter",
  {
    state: () => ({ count: 0 }),
    // state: () => {
    //   return { count: 0 }
    // },
    actions: {
      increment() {
        this.count++;
      },
    },
  }
);
// 组合式写法 
export const useCounterStore = defineStore(
  "counter",
  () => {
    const count = ref(0);
    const increment =()=> {
      count.value++;
    }
    return {
      count,
      increment
    };
  },
  {
  //...更多配置
  }
);

由于Pinia支持Composition API 所以平时会用组合式写法。 在上面代码中defineStore有三个参数:

  • 第一个参数:storeName 类型:String 描述:store的名称。标识该store的唯一性
  • 第二个参数:setup 类型: () => StoreDefinition<State, Getters, Actions, StoreOptions> 描述:类似Vue组件中setup()函数
  • 第三个参数:storestoreOptions(可选) 类型:StoreOptions 描述:一个对象,包含一些 store 的选项

简单来说 第一个参数像是一个id 给某个store绑定上,给这个仓库唯一化。 第二个参数规定了仓库里面的初始值以及变化值。第三个参数 是个配置选项,例如 persist(是否启用持久化存储)、devtools(是否启用开发工具)等。 最后使用export 抛出useCounterStore 方法

使用

vue
<template>
  <!-- 直接从 store 中访问 state -->
  <div>Current Count: {{ counter.count }}</div>
  <button @click="clickHanlde">加1</button>
</template>

<script setup>
  import { useCounterStore } from '@/store/counter'

  const counter = useCounterStore()
  const clickHanlde=()=>{
    counter.increment()
  }

</script>

<style scoped>
</style>

数据持久化

示例刷新会发现count会变成0,因为数据没有持久化处理,而pinia本身没有提供数据持久化,因此需要安装插件pinia-plugin-persistedstate。

  1. 安装
sh
npm install pinia-plugin-persistedstate
  1. 在store/index.js中挂载
js
import { createPinia } from "pinia" //引入pinia
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' //引入持久化插件

const pinia = createPinia() //创建pinia实例
pinia.use(piniaPluginPersistedstate) //将插件添加到 pinia 实例上

export default pinia //导出pinia用于main.js注册
  1. 在store/counter.js中使用 1. 基本使用
> 创建 Store 时,将 persist 选项设置为 true,整个 Store 将使用默认持久化配置保存。
**默认持久化配置:**
  - 使用 localStorage进行存储
  - store.$id作为 storage 默认的 key
  - 使用 JSON.stringify / JSON.parse进行序列化/反序列化
  - 整个 state 默认将被持久化
js
import { defineStore } from "pinia"
const useUserInfoStore = defineStore('userInfo', {
  // defineStore('userInfo',{})  userInfo就是这个仓库的名称name
  state: () => ({
    username:'赫赫',
    age: 23,
    like: 'girl',
  }),
  getters: {
        ...........
  },
  action:{
    .........
  },
  persist: true,
})
export default useUserInfoStore
2. 高级使用
> 如何你不想使用默认的配置,那么可以将一个对象传递给 Store 的 persist 属性来配置持久化
**三个常用属性:**
- key:存储名称。
- storage:存储方式。
- path:用于指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态,undefined 或 null 表示持久化整个 state。
js
import { defineStore } from "pinia"
const useUserInfoStore = defineStore('userInfo', {
  // defineStore('userInfo',{})  userInfo就是这个仓库的名称name
  state: () => ({
    username:'赫赫',
    age: 23,
    like: 'girl',
    obj:{ money:100,friend:10 }
  }),
  getters: {
        ...........
  },
  action:{
    .........
  },
  persist: {
      key: 'piniaStore', //存储名称
      storage: sessionStorage, // 存储方式
      paths: ['username', 'like','obj'], //指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态,undefined 或 null 表示持久化整个 state
  },
})
export default useUserInfoStore