一、什么是Pinia?
Pinia 是一个专门为 Vue 3 设计的状态管理库。它的目标是提供一种简单、直观的方法来管理 Vue 应用的状态,同时充分利用 Vue 3 的响应式系统和组合式 API。
Pinia 主要特点包括:
-
基于 Vue 3:Pinia 是专门为 Vue 3 设计的状态管理库,充分利用了 Vue 3 的响应式系统和组合式 API。
-
使用 Composition API:Pinia 鼓励使用 Vue 3 的 Composition API 来定义和操作状态,这使得状态管理逻辑更加清晰和灵活。
-
零依赖:Pinia 是一个轻量级的状态管理库,没有任何依赖,这意味着你可以根据自己的需要选择是否引入额外的库。
-
插件化:Pinia 提供了丰富的插件生态,可以轻松地扩展其功能,比如可以与 DevTools 插件结合,方便调试状态变化。
-
类型安全:Pinia 充分利用 TypeScript 的支持,提供了类型安全的状态管理方案,让你在开发过程中更加放心。
-
服务端渲染支持:Pinia 提供了对服务端渲染的支持,使得在服务端渲染的 Vue 应用中也能够方便地使用状态管理。
总结:
1.提供了更加简单的API(去掉了mutation)
2.提供符合组合式风格的API(和Vue3.0的语法统一)
3.去掉了modules的概念,每一个store都是一个独立的模块
4.配合ts更加友好,童工可靠的类型判断
二、手动添加Pinia到Vue项目
1.使用Vite创建一个空的Vue项目
npm create vue@latest
2.按照官方文档安装Pinia
(1)安装Pinia
npm install pinia
(2)挂载Pinia(main.js)
import './assets/main.css' import { createApp } from 'vue' import {createPinia} from 'pinia' //导入Pinia import App from './App.vue' import router from './router' const app = createApp(App) //创建Pinia实例 const pinia = createPinia() app.use(router).use(pinia)//Pinia插件安装配置 app.mount('#app') //挂载
(3)使用Pinia
- 创建Store
import { defineStore } from "pinia"; import { ref } from "vue"; //定义store // defineStore(id,options) id:唯一标识符 options:配置对象export const useCounterStore = defineStore('counter',()=>{ //声明数据 state const count = ref(0)
const message = ref('hello')
//声明操作数据的方法 action const addCount = ()=>count.value++ const subCount = ()=>count.value--
//声明基于数据派生的计算属性 getters
const double = computed(()=>count.value*2)
return { count, message, addCount, subCount, double }
- 组件使用Store
<script setup> import SonCom from '@/components/SonCom.vue'; import Son2Com from '@/components/Son2Com.vue' import {useCounterStore} from '@/store/counter' //导入对应的store const counterStore = useCounterStore() //保存着我们要使用的数据和方法 </script> <template> <div><h3>APP {{ counterStore.count }} {{ counterStore.double }}</h3>
//使用方式
<h3>APP {{ counterStore.message }}</h3> <SonCom></SonCom> <Son2Com></Son2Com> </div> </template> <style scoped> </style>
<script setup> import {useCounterStore} from '@/store/counter' const counterStore = useCounterStore() </script> <template> <div> <h3>Son1 {{ counterStore.count }} <button @click="counterStore.addCount">+</button></h3> </div> </template> <style scoped> </style>
- action异步实现
import { defineStore } from "pinia"; import {ref} from 'vue' export const useChannelStore = defineStore('channel',()=>{ //声明数据 const channelList = ref([]) //声明修改数据的方法 const getList = async ()=>{ const res= await axiox.get('...') channelList.value = res.data } //声明getters //return return { channelList, getList } })
<script setup> import SonCom from '@/components/SonCom.vue'; import Son2Com from '@/components/Son2Com.vue' import {useCounterStore} from '@/store/counter' import {useChannelStore} from '@/store/channel' const counterStore = useCounterStore() const channelStore = useChannelStore() </script> <template> <div> <h3>APP {{ counterStore.count }} {{ counterStore.double }}</h3> <h3>APP {{ counterStore.message }}</h3> <SonCom></SonCom> <Son2Com></Son2Com> <button @click="channelStore.getList">get List</button> </div> </template> <style scoped> </style>
3.storeToRefs方法使用
目的:解构数据之后还可以实现响应式数据
原因:因为解构赋值会将对象或数组中的值提取出来,赋值给新的变量,而这些新的变量并没有保持原始数据的响应式关系。换句话说,解构赋值会破坏原始数据的响应式性质。
原理:在Vue 3中,响应式系统通过reactive
和ref
两种API来实现。reactive
用于创建一个响应式对象,而ref
用于创建一个包装了普通JavaScript值的Ref对象。Ref对象具有value
属性,用于访问其包装的值,并且在模板中使用时会自动解包。Pinia的storeToRefs
函数的作用就是将Pinia store中的状态转换为Ref对象。它的原理大致如下:
- 遍历Pinia store中的状态对象。
- 对每个状态属性,使用
ref
函数将其包装为Ref对象。 - 返回一个新的对象,该对象的每个属性都是之前状态对象中对应属性的Ref对象。
<script setup> import {useCounterStore} from '@/store/counter' import { storeToRefs } from 'pinia'; const counterStore = useCounterStore() const {count,message} = storeToRefs(counterStore) </script> <template> <div> <h3>APP {{ count }} </h3> <h3>APP {{ message }}</h3> </div> </template>
三.Pinia持久化
1.安装插件 pinia-plugin-persistedstate
npm install pinia-plugin-persistedstate
2.main.js挂载
import { createApp } from 'vue' import {createPinia} from 'pinia' //导入Pinia import App from './App.vue' import router from './router' import persistedStatePlugin from 'pinia-plugin-persistedstate' //导入Pinia持久化插件 const app = createApp(App) //创建Pinia实例 const pinia = createPinia() app.use(router).use(pinia.use(persistedStatePlugin))//Pinia插件安装配置 app.mount('#app') //挂载
3.store仓库,persist:true 开启
import { defineStore } from "pinia"; import { computed, ref } from "vue"; //定义store // defineStore(id,options) id:唯一标识符 options:配置对象 export const useCounterStore = defineStore('counter',()=>{ //声明数据 state const count = ref(0) return { count,
},{ persist : true ,//开启当前模块持久化 } )
4.配置插件
storage
:指定要使用的本地存储类型,默认为localStorage
。可以是localStorage
或者sessionStorage
。key
:指定存储在本地存储中的键名,默认为'pinia-state'
。serializer
:指定一个自定义的序列化器函数,用于序列化状态对象,默认为JSON.stringify
。
import { defineStore } from "pinia"; import { computed, ref } from "vue"; //定义store // defineStore(id,options) id:唯一标识符 options:配置对象 export const useCounterStore = defineStore('counter',()=>{ //声明数据 state const count = ref(0) const message = ref('hello') return { count, message, } },{ // persist : true ,//开启当前模块持久化 persist : { key : 'local-counter', storage : localStorage,//sessionStorage paths:['count'] ,//指定数据持久化 } } )
标签:count,Vue,const,Pinia,Vue3.0,pinia,import,ref From: https://www.cnblogs.com/qinlinkun/p/18093691