状态管理-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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构