浅析Vue项目中怎么用Pinia状态管理工具

 3118

Vue项目中怎么用Pinia状态管理工具?下面本篇文章带大家聊聊Vue项目中Pinia状态管理工具的使用,希望对大家有所帮助!


浅析Vue项目中怎么用Pinia状态管理工具


Pinia官网介绍说:Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。Vuex同样可以作为状态管理工具,那么两者有什么区别呢?


浅析Vue项目中怎么用Pinia状态管理工具


Pinia与Vuex的区别

pinia只有store、getter、actions,么有mutations,简化了状态管理的操作。

pinia模块划分不需要modules,

pinia自动化代码拆分

pinia对ts支持很好以及vue3的composition API

pinia体积更小,性能更好

使用Pinia

defineStore( ) 方法的第一个参数:容器的名字,名字必须唯一,不能重复

defineStore( ) 方法的第二个参数:配置对象,放置state,getters,actions

state 属性: 用来存储全局的状态

getters属性: 用来监视或者说是计算状态的变化的,有缓存的功能

actions属性: 修改state全局状态数据,可以是异步也可以是同步

Pinia可以用于vue2.x也可以用于vue3.x中

安装

  1. yarn add pinia -S

main.js引入

  1. import {createApp} from "vue"
  2. import App from "./app.vue"
  3. import store from "./store/index.js"
  4. const app = createApp(App);
  5. const store = createPinia();
  6. app.use(store).mount("#app")

在store文件夹下新建test.js

  1. import {definePinia} from "pinia"
  2. export default testStore = definePinia('testId',{
  3.     state:()=>{
  4.          tname:"test",
  5.          tnum:0,
  6.     },
  7.     getters:{
  8.        changeTnum(){
  9.            console.log("getters")
  10.            this.tnum++;
  11.        }
  12.     },
  13.     actions:{
  14.        addNum(val){
  15.           this.tnum += val
  16.        }
  17.     },
  18.     //持久化存储配置
  19.     presist:{
  20.          enable:true,//
  21.          strategies:[
  22.             {
  23.             key:"testId",
  24.             storage:localStorage,
  25.             paths:['tnum']
  26.             } 
  27.          ]
  28.     }
  29. })

在用actions的时候,不能使用箭头函数,因为箭头函数绑定是外部的this。actions里的this指向当前store

在store文件夹下新建index.js,便于管理

  1. import {createPinia} from "pinia"
  2. const store = createPinia();
  3. export default store

新建A.vue组件,引入store模块和storeToRefs方法storeToRefs:解构store中的数据,使之成为响应式数据

  1. <template>
  2.     <div>
  3.         <div> {{tname}}</div>
  4.         <div> {{tid}}</div>
  5.         <div> tnum: {{tnum}}</div>
  6.         <div> {{tchangeNum}}</div>
  7.         <div><button @click="tchangeName">修改</button></div>
  8.         <div> <button @click="treset">重置</button></div>
  9.         <div @click="actionsBtn">actionsBtn</div>
  10.     </div>
  11. </template>
  1. <script setup>
  2. import { storeToRefs } from 'pinia'
  3. import { useStore } from '../store/user'
  4. import { useTest } from '../store/test.js'
  5. const testStore = useTest();
  6. let { tname, tchangeNum, tnum } = storeToRefs(testStore)
  7. </script>


直接修改数据的两种方式

直接修改数据与使用$path修改数据相比,官方已经明确表示$patch的方式是经过优化的,会加快修改速度,对程序的性能有很大的好处。所以如果你是多条数据同时更新状态数据,推荐使用$patch方式更新。

虽然可以直接修改,但是出于代码结构来说, 全局的状态管理还是不要直接在各个组件处随意修改状态,应放于actions中统一方法修改(piain没有mutation)。

  1. //直接修改数据
  2. tchangeName(){
  3.      tname.value = "测试数据"
  4.      tnum.value++;
  5. }
  6. //当然也可以使用`$path`批量修改
  7. tchangeName(){
  8.      testStore.$path(state=>{
  9.           state.tname = "测试数据"
  10.           state.value = 7;
  11.      })
  12. }


使用actions修改数据

直接调用actions中的方法,可传参数

  1. const actionsBtn = (){
  2.       testStore.addNum(5)  
  3. }


重置state中数据

store中有$reset方法,可以直接对store中数据重置

  1. const treset = (){
  2.     testStore.$reset()
  3. }


Pinia持久化存储

实现持久化存储,需要配合以下插件使用

  1. yarn add  pinia-plugin-persist

配置store文件夹下的index.js文件,引入pinia-plugin-presist插件

  1. import {createPinia} from "pinia"
  2. import piniaPluginPresist from "pinia-plugin-presist"
  3. const store = createPinia();
  4. store.use(piniaPluginPresist)
  5. export default store

配置stroe文件夹下的test.js文件,使用presist属性进行配置

  1. import {definePinia} from "pinia"
  2. export default testStore = definePinia('testId',{
  3.     state:()=>{
  4.          tname:"test",
  5.          tnum:0,
  6.     },
  7.     getters:{
  8.        changeTnum(){
  9.            console.log("getters")
  10.            this.tnum++;
  11.        }
  12.     },
  13.     actions:{
  14.        addNum(val){
  15.           this.tnum += val
  16.        }
  17.     },
  18.     //持久化存储配置
  19.     presist:{
  20.          enable:true,//
  21.          strategies:[
  22.             {
  23.             key:"testId",
  24.             storage:localStorage,
  25.             paths:['tnum']
  26.             } 
  27.          ]
  28.     }
  29. })

enable:true,开启持久化存储,默认为使用sessionStorage存储

- strategies,进行更多配置
- key,不设置key时,storage的key为definePinia的第一个属性,设置key值,则自定义storage的属性名

storage:localStorage,设置缓存模式为本地存储

paths,不设置时对state中的所用数据进行持久化存执,设置时只针对设置的属性进行持久化存储


Pinia模块化实现

模块化实现即在store对要使用的模块新建一个js文件,比如user.js文件。然后配置内容跟其他模块一样,根据自己需求进行设置,然后在对应页面引入。


浅析Vue项目中怎么用Pinia状态管理工具


Pinia中store之间互相调用

比如:test.js获取user.jsstatename属性值,在test.js引入user.js

  1. import { defineStore } from 'pinia'
  2. import { userStore } from "./user.js"
  3. export const useTest = defineStore("testId", {
  4.     state: () => {
  5.         return {
  6.             tid: "111",
  7.             tname: "pinia",
  8.             tnum: 0
  9.         }
  10.     },
  11.     getters: {
  12.         tchangeNum() {
  13.             console.log('getters')
  14.             return this.tnum + 100
  15.         }
  16.     },
  17.     actions: {
  18.         tupNum(val) {
  19.             console.log('actions')
  20.             this.tnum += val;
  21.         },
  22.         getUserData() {
  23.             console.log(useStore().name);
  24.             return useStore().name;
  25.         },
  26.     },
  27.     persist: {
  28.         //走的session
  29.         enabled: true,
  30.         strategies: [
  31.             {
  32.                 key: "my_testId",
  33.                 storage: localStorage,
  34.                 paths: ['tnum']
  35.             }
  36.         ]
  37.     }
  38. })

user.js

  1. import { defineStore } from 'pinia'
  2. export const useStore = defineStore('storeId', {
  3.   state: () => {
  4.     return {
  5.       num: 0,
  6.       name: '张三'
  7.     }
  8.   }
  9. })

A.vue组件中,调用test.jsgetUserData方法就可以得到uesr.js中的name

  1. const actionBtn = () => {
  2.     testStore.getUserData()
  3. };


本文网址:https://www.zztuku.com/index.php/detail-13324.html
站长图库 - 浅析Vue项目中怎么用Pinia状态管理工具
申明:本文转载于《CSDN》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐