状态管理-pinia的使用

1. pinia和vuex的区别

  • pinia没有mutations,只有:state、 getters、 actions
  • pinia分模块不需要modules(之前vuex分模块需要modules)
  • pinia体积更小(性能更好)
  • pinia可以直接修改state数据

2.安装pinia

npm i pinia

根据需要 安装pinia-plugin-persist插件,实现持久化存储

npm i pinia-plugin-persist

3.main.ts中导入

import { createApp } from 'vue'
import App from './App.vue'

import { createPinia } from 'pinia' // 从pinia中导入createPinia方法
import piniaPersist from 'pinia-plugin-persist'  //导入持久化存储

const app = createApp(App)

const pinia = createPinia()
pinia.use(piniaPersist)    //使用持久化存储,不需要可不写

app.use(pinia) // 使用vue实例的use方法,告诉vue我们要使用pinia
app.mount('#app')

4.创建store

新建store文件夹,新建userInfo.ts模块文件来存放用户信息相关的数据,因为pinia中没有modules区分模块,store下的每个文件就是一个模块

创建store很简单,调用pinia中的defineStore函数即可,该函数接收两个参数:

name:一个字符串,必传项,该store的唯一id。
options:一个对象,store的配置项,比如配置store内的数据,修改数据的方法等等。
我们可以定义任意数量的store,因为我们其实一个store就是一个函数,这也是pinia的好处之一,让我们的代码扁平化了,这和Vue3的实现思想是一样的。

import { defineStore } from 'pinia' //从pinia中导入,defineStore方法,用于定义一个新的store

// 第一个参数是应用程序中 store 的唯一 id,最好和文件名同意
export const userInfoStore = defineStore('userInfo', { // 使用defineStore方法定义store
  state:() => {                       // state表示这个store里的状态,也就是存放数据的地方
    return {
      userName: 'pinia定义的数据',       // 这里我们定义了一个数据叫userName,用于存放我们的用户名 
    }
  },
  getters: {
    double: (state) => '姓名:' + state.userName,
  },
  actions: {
    // 修稿state的值
    changeStateVal(val: any) {
      this.userName = val
    }
  },

  // 持久化存储配置
  persist: {
    enabled: true , // pinia-plugin-persist 是否开启持久化存储, 默认sessionStorage
    strategies: [{
      // key: 'userInfo',      //存储的key,默认当前store的key 
      // paths: ['userName'],   //哪个属性需要持久化存储,默认全是
      storage: localStorage    //使用localStorage存储
    }]
  }
})

5.使用store

引入使用即可,pinia中有多种方式可以修改state中的数据

<template>
  <div>
    {{ store.userName }}
    <button @click="handleUpdatePinia">修改pinia数据</button>
  </div>
</template>

<script setup lang="ts">
import { reactive, ref } from "vue";
import { storeToRefs } from "pinia";     //和vue中toRefs的作用一模一样
import { userInfoStore } from "../store/userInfo";  //直接引入store中定义的 userInfoStore
const store = userInfoStore();           // 然后实例化


const handleUpdatePinia = () => {
  // 第一种方式:直接修改
  // store.userName = 'dfads'    //直接修改pinia的数据

  // 第二种方式 通过$patch
  // 1.
  // store.$patch({
  //   userName: "被修改的值",
  // });

  // 2.
  // store.$patch((state) => {
  //   state.userName = "被修改的值";
  // });

  //第三种方式 通过actions里的方法修改
  store.changeStateVal("被修改的值"); //可以直接给actions里面的方法传递参数
};


</script>
posted @ 2023-04-27 15:36  顺·  阅读(354)  评论(0编辑  收藏  举报