iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue中使用pinia全局状态管理的实现
  • 263
分享到

vue中使用pinia全局状态管理的实现

2024-04-02 19:04:59 263人浏览 安东尼
摘要

目录与Vuex的区别安装引入pinia创建状态目录pinia模块组成创建pinia模块在组件中使用该状态机pinia模块实例中的api讲解状态持久化与vuex的区别 去除了 muta

与vuex的区别

去除了 mutation 选项。省去了复杂的disptachcommit流程,直接通过模块实例调用实例的actions中的方法即可触发对应action;在组件中直接可以通过模块实例的$patch修改store状态或者通过action来间接修改store状态。响应式数据原理是proxy,使得数据的增加或者删除字段都具备响应式。

安装

yarn add pinia

引入pinia

main.ts中注册pinia插件

import {createPinia} from 'pinia'    // vue3
// import {PiniaVuePlugin} from 'pinia' // vue2

const app=createApp(App)
app.use(createPinia())
app.mount('#app')

创建状态目录

在src下创建文件夹store,在store下创建文件index.ts,a.ts,b.ts。a.ts和b.ts分别是管理某个状态的模块,index.ts用来整合这些模块。

pinia模块组成

state、actions、getters。

创建pinia模块

对应选项的含义看代码注释。
1.在a.js编写如下代码

import {defineStore} from "pinia"

export default defineStore('a',{    // a是模块的命名空间,不能和其他模块的一样
    state:()=>({         // state是一个函数,函数返回值为管理的状态
        x:0,
        y:0,
    }),
 })

2.在b.ts编写如下代码

import {defineStore} from "pinia"

export default defineStore('b',{
    state:()=>({
        name:'b',
        age:18,
    }),
    actions:{
        print(msg:string){     // 同步action
            console.log(msg)
         },
        async setAge(newAge:number){       // 异步action
            // 模拟接口
            const setAgeReq=<T>(age:T)=>new Promise<T>((rel)=>{
                setTimeout(()=>{rel(age)},1000)
            })
            
            const age=await setAgeReq(newAge)
            // 在action中通过实例来直接修改状态
            this.age=age   
            // 在action中也可以通过实例直接调用其他action 
            // this.print('age is be updated success')   
        }
    },
    getters:{ 
        // 和vuex的getters一样,返回一个值就行了。和computed一样具有缓存机制               
        userInfo():string{    
            return `name:${this.name} age:${this.age}`
        }
    },


})

3.在index.ts中整合所有模块

import a from "./a"
import b from "./b"

export {
   a,b
}

在组件中使用该状态机

pinia的api基本都在该案例中,注释和代码都很容易理解,相信小伙伴们都看的懂。如果不是很明白,可以看下一章节的api讲解,看懂的可以跳过api讲解章节。

<script setup lang='ts'>
// 引入pinia模块
import {a as useA ,b as useB} from "./store"  
import {storeToRefs} from "pinia" 

// 模块是一个函数,函数的返回值是模块的实例
const storeA=useA()
const storeB=useB()


const addx=()=>{storeA.$patch((s)=>{s.x++})}
const addy=()=>{storeA.$patch((s)=>{s.y++})}
// 如果要解构使用状态需要使用该api进行转换,否则不具备响应式
const {x,y}=storeToRefs(useA())

// 通过action间接修改store状态
const setAge=()=>{
 // 异步action返回promise。原理也很简单,async函数的返回值是promise
 storeB.setAge(20).then(()=>{console.log('age is be updated success')})
}

// 通过 $subscribe监听状态的变更
storeB.$subscribe((c,s)=>{  // state变化时回调。有变化信息和状态两个参数
//    console.log(c)
//    console.log(s)
},{
	detached:false,  // 在组件卸载时是否继续监听
	deep:true,  // 是否深度监听
	flush:'post',  // post:组件更新后执行;sync:始终同步触发;pre:组件更新前执行
})

// 通过$onAction监听action的调用
storeB.$onAction((c)=>{   // 当调用action时回调
    // console.log(c)
    // c.after(()=>{console.log('after caller')})  //after的回调在该函数中最后执行
    // console.log('action')
},false)   // 为true时,组件卸载时也监听该行为

// 通过$reset重置对应模块的状态
const reSetAge=()=>{  
   storeB.$reset()
}

</script>

<template>
	<h3>模块a</h3>
	<p>({{storeA.x}},{{storeA.y}})</p>
	<button @click="addx">x++</button>
	<button @click="addy">y++</button>
	<h3>模块b</h3>
	<p>用户信息:{{storeB.userInfo}}</p>
	<button @click="setAge">setAge</button>
	<button @click="reSetAge">reSetAge</button>

</template>

运行结果:

pinia模块实例中的api讲解

1.获取模块实例

// 引入模块
import {a as useA ,b as useB} from "./store"  

// 模块是一个函数,函数的返回值是模块的实例
const storeA=useA()
const storeB=useB()

2.提供实例修改对应模块的状态
i:直接修改


const addx=()=>{storeA.$patch((s)=>{s.x++})}
const addy=()=>{storeA.$patch((s)=>{s.y++})}

ii:间接修改

import {storeToRefs} from "pinia" 
// 如果要解构使用状态需要使用该api进行转换,否则不具备响应式
const {x,y}=storeToRefs(useA())

3.状态的解构使用

import {storeToRefs} from "pinia" 
// 如果要解构使用状态需要使用该api进行转换,否则不具备响应式
const {x,y}=storeToRefs(useA())

4.监听状态的变更

// 通过 $subscribe监听状态的变更
storeB.$subscribe((c,s)=>{  // state变化时回调。有变化信息和状态两个参数
//    console.log(c)
//    console.log(s)
},{
detached:false,  // 在组件卸载时是否继续监听
deep:true,  // 是否深度监听
flush:'post',  // post:组件更新后执行   ,sync:始终同步触发     ,pre:组件更新前执行
})

5.监听action的触发

// 通过$onAction监听action的调用
storeB.$onAction((c)=>{   // 当调用action时回调
    // console.log(c)
    // c.after(()=>{console.log('after caller')})  //after的回调在该函数中最后执行
    // console.log('action')
},false)   // 为true时,组件卸载时也监听该行为

6.重置状态

// 通过$reset重置对应模块的状态
const reSetAge=()=>{  
   storeB.$reset()
}

7.注册插件

import {createPinia} from 'pinia'
// plugin是一个函数 
createPinia().use(Plugin)   

状态持久化

这里需要使用到注册插件的功能。首先在src/plugins/pinia/persistence.ts中编写如下代码

import {PiniaPluginContext} from 'pinia'
import {toRaw } from 'vue' 

// 封装pinia持久化插件。执行时机:store初始化时,执行次数是模块的次数
export default function(type:'localStorage' | 'sessionStorage'){
   
    return (ctx:PiniaPluginContext)=>{
       //    console.log(ctx)
   // const {app,options,pinia,store}=ctx
   
   const store= ctx.store    // 每次执行时的store是关于那个模块的store
   const storeWay=type==='localStorage'?localStorage:sessionStorage
   // console.log(store)
   store.$subscribe(()=>{  
      // console.log(toRaw(store.$state))
      
      storeWay.setItem('pinia_'+store.$id,JSON.stringify(toRaw(store.$state)))
   },{deep:true})
   
    // return的值为store初始状态。pinia处理过了,如果为retrun为null使用模块的初始值,
    return JSON.parse(storeWay.getItem('pinia_'+store.$id) as any)
    }
}

然后在mian.js编写如下代码即可。此时刷新浏览器刷新时,状态是可以保持的,不会被重置。

import { createApp} from 'vue'
import App from './App.vue'
import {createPinia} from 'pinia' 
// import {PiniaVuePlugin} from 'pinia' // vue2
import persistence from "./plugins/pinia/persistence"

const app=createApp(App)

// app.use(createPinia().use(persistence('sessionStorage')))   //sessionStorage方式持久化
app.use(createPinia().use(persistence('localStorage')))  //localStorage方式持久化

app.mount('#app')

到此这篇关于vue中使用 pinia 全局状态管理的实现的文章就介绍到这了,更多相关vue pinia 全局状态管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue中使用pinia全局状态管理的实现

本文链接: https://www.lsjlt.com/news/153462.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue中使用pinia全局状态管理的实现
    目录与vuex的区别安装引入pinia创建状态目录pinia模块组成创建pinia模块在组件中使用该状态机pinia模块实例中的api讲解状态持久化与vuex的区别 去除了 muta...
    99+
    2022-11-13
  • Vue全新状态管理Pinia怎么用
    这篇文章给大家分享的是有关Vue全新状态管理Pinia怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Vuex 作为一个老牌 Vue 状态管理库,大家都很熟悉了Pinia 是 Vue.js 团队成员专门为 V...
    99+
    2023-06-29
  • Vue新的状态管理Pinia怎么使用
    今天小编给大家分享一下Vue新的状态管理Pinia怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。为什么有 Vuex ...
    99+
    2023-07-06
  • Vue状态管理之使用Pinia代替Vuex
    目录1、Pinia是什么2、Pinia简单上手3、使用体验1、Pinia是什么 Pinia是一个vue的状态管理方案,是vuex团队成员开发,实现了很多vuex5的提案,更加地轻量化...
    99+
    2022-11-12
  • Vue状态管理库Pinia和Vuex使用哪个好
    今天小编给大家分享一下Vue状态管理库Pinia和Vuex使用哪个好的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Vuex ...
    99+
    2023-07-05
  • Vue项目中如何用Pinia状态管理工具
    这篇文章主要介绍“Vue项目中如何用Pinia状态管理工具”,在日常操作中,相信很多人在Vue项目中如何用Pinia状态管理工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue项目中如何用Pinia状态管...
    99+
    2023-07-04
  • Pinia怎么实现简单的用户状态管理
    这篇“Pinia怎么实现简单的用户状态管理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Pinia怎么实现简单的用户状态管理...
    99+
    2023-07-04
  • Vue新一代状态管理工具Pinia的具体使用
    目录前言优点安装创建并挂载创建store使用store回显与修改state使用$patch对多条数据直接修改使用actions使用getters多个store相互调用数据持久化安装使...
    99+
    2022-09-27
  • 浅析Vue项目中怎么用Pinia状态管理工具
    安装yarn add pinia -Smain.js引入import {createApp} from "vue" import App from "./app.vue" import store f...
    99+
    2022-11-22
    Vue Pinia
  • Vue项目新一代状态管理工具Pinia的使用教程
    目录前言Pinia与Vuex的区别使用Pinia直接修改数据的两种方式使用actions修改数据重置state中数据Pinia持久化存储Pinia模块化实现Pinia中store之间...
    99+
    2022-11-13
    vue pinia状态管理工具 vue pinia用法 vue状态管理工具
  • Vue3状态管理之Pinia的入门使用教程
    目录Vue3 新的发展方向(来源于尤大知乎)一、Pinia 简介与基础1.1 Pinia 简介1.2 Pinia 基础二、Pinia 在Vue3-Vite中的使用2.1 基础使用流程...
    99+
    2022-11-13
  • react18中react-redux状态管理的实现
    react的状态管理还是挺多的现在流行的有以下五种: RecoilMobXXStateReduxContext 今天我们来讲一下react众多状态管理之一的redux,虽然这个我不太...
    99+
    2022-11-13
  • vue3如何使用provide实现状态管理详解
    目录前言如何通过 provide/inject 实现 Vuex的功能在应用中注册此插件插件的入口文件创建 store ,把对应的数据挂载到根组件上实现 mapState、mapMut...
    99+
    2022-11-12
  • Mobx实现React 应用的状态管理详解
    目录MobX从一个 demo 开始创建类并将其转化成可观察对象使用可观察对象MobX 与 React 集成在组件中使用可观察对象1. 访问全局的类实例2. 通过 props3. 通过...
    99+
    2022-12-08
    Mobx React 应用状态管理 Mobx React
  • 如何使用Redis实现用户登录状态管理
    《如何使用Redis实现用户登录状态管理,需要具体代码示例》  Redis是一种开源的内存数据库,它被广泛应用于缓存、会话管理和消息队列等领域。在Web开发中,用户登录状态管理是一个非常重要的功能,而Redis正是一个很好的选择来实现这一功...
    99+
    2023-11-09
    redis 用户 登录状态
  • Vuex中状态管理器的使用详解
    目录一、Vuex是什么?二、什么时候使用Vuex三、Vuex的核心概念和API四、应用举例五、vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex一、Vuex是什么? Vu...
    99+
    2022-11-13
  • Linux中使用全局框架怎么实现内存管理
    Linux中使用全局框架怎么实现内存管理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.  地址划分。1. CPU地址。CPU地址是指CPU的地址总...
    99+
    2023-06-16
  • Vue中状态管理器(vuex)详解以及实际应用场景
    目录Vue中 常见的组件通信方式可分为三类Vuex简介1. State2. Getters3. Mutations4. Actions5. 使用 mapState、mapGetter...
    99+
    2022-11-16
    vuex 状态管理 vue 状态管理 vue状态管理器vuex
  • 怎么使用Vuex模块化实现待办事项的状态管理
    这篇文章主要介绍“怎么使用Vuex模块化实现待办事项的状态管理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Vuex模块化实现待办事项的状态管理”文章能帮助大家解决问题。效果:待办事项中的一...
    99+
    2023-07-04
  • 浅析集中式状态管理Vuex的使用方法
    如何使用集中式状态管理的Vuex?下面本篇文章就带大家了解一下vuex,简单聊聊vuex的使用方法,希望对大家有所帮助!1.vuex是什么一个专门在Vue中实现集中式状态管理的一个Vue插件,可以对vue应用中多个组件的共享状态进行集中式的...
    99+
    2023-05-14
    VueX
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作