【Pinia】小菠萝详细使用说明

文章目录

  • 1. 介绍
    • 1.1 Pinia介绍
    • 1.2 pinia的属性说明
  • 2. 安装
  • 3. 初步使用
  • 4. store具体使用
    • 4.1 值修改
      • 4.2.1 直接修改
      • 4.2.2 通过$patch整体修改
      • 4.2.3 通过$patch函数式
      • 4.2.4 通过$state整体修改
      • 4.2.5 通过actions修改
    • 4.2 解构store
  • 5 actions使用
  • 6. getters使用
    • 6.1 通过this获取
    • 6.2 通过state获取
    • 6.3 传参使用
  • 7.API
    • 7.1 重置state($reset)
    • 7.2 $subscribe
    • 7.3 $onActon
  • 8. 持久化插件
    • 8.1 插件安装
    • 8.2 使用
    • 8.3 局限性
      • 8.3.1 引用类型可能会失效
      • 8.3.2 基本数据类型之外的不会被序列化
    • 8.4 全局配置

1. 介绍

1.1 Pinia介绍

在这里插入图片描述
官网地址:https://pinia.vuejs.org/zh/

主要优点:
全局状态管理工具,Pinia.js有以下的特点:

  • 完整的ts支持
  • 体积小,只有1kb左右
  • 去除mutations,只有state,getter,action
  • actions支持同步与异步
  • 代码扁平化没有模块嵌套,只有store的概念,store之间可以自由使用,每个store都是独立的。
  • 无需手动添加store,store一旦创建便会自动添加
  • 支持 vue2和vue3
  • 支持插件扩展功能

什么时候可以使用?
保存全局信息的时候,例如登录的个人信息。
复杂的表单时,比如多个步骤的表单。

1.2 pinia的属性说明

defineStore方法的第一个参数:相当于为容器起一个名字。注意:这里的名字必须唯一,不能重复。
defineStore方法的第二个参数:可以简单理解为一个配置对象,里边是对容器仓库的配置。当然这种说明是以对象的形式存在。
state属性: 用来存储全局的状态的属性。
getters属性:用来监视或者说是计算状态的变化的,有缓存的功能。
actions属性:用来修改state全局状态数据的,复杂的计算逻辑可以放到这里。

2. 安装

pnpm i pinia

在main.ts中添加

import {createPinia} from 'pinia'const store = createPinia()
app.use(store)

3. 初步使用

(1)在项目的src目录下新建store文件夹,
(2)在store文件夹里面新建store-name.ts和index.ts。

store-name用来定义枚举类型的名称作为store的唯一值。
store-name.ts

#这里定义了2个枚举名称分别为USERSYSTEM
export const enum Names{USER = "USER",SYSTEM = "SYSTEM"
}

在index.ts中,
useUserStore是通过选项式类型Store
useSystemStore是组合式类似的Store

引入仓库插件:

import {defineStore} from 'pinia'

定义仓库1,指定的唯一id,是在使用时需要
这里的useXXXXXStore 是约定俗成的命名规范,下面就是选项式定义仓库的方式。

export const useXXXXXStore = defineStore("唯一id",{state:()=>{},getters:{},actions:{}
}

以下两种分别介绍了选项式和组合式仓库定义的具体应用,针对唯一id,这里抽取出来作为独立的枚举类型。
也可以不用抽取,直接写,但是必须所定义的字符串是唯一的:

import {defineStore} from 'pinia'
import { Names } from './store-name'
import {ref} from "vue"//options 选项式API
export const useUserStore = defineStore(Names.USER,{//data: 类似于组件中的datastate:()=>{return {name: "张三",age:20}},//computed 修饰一些值getters:{},//methods 可以做同步、异步,提交stateactions:{}
})//setup store 组合式API
export const useSystemStore = defineStore(Names.SYSTEM,()=>{const systemInfo = ref({version:"win10"})function getMemory(){return "16G"}return {systemInfo, getMemory}
})

在vue中,分别调用2种不同store库,都可以使用:

<script setup lang='ts'>
import { useUserStore, useSystemStore } from "./store"
const user = useUserStore()
const system = useSystemStore()
</script><template><div><p>User Name:{{ user.name }}</p><p>User Age: {{ user.age }}</p></div><div><p>System Info: {{ system.systemInfo.version }}</p><p>System Memory: {{ system.getMemory() }}</p></div>
</template><style scoped></style>

页面显示如下:
在这里插入图片描述

4. store具体使用

4.1 值修改

4.2.1 直接修改

通过点击changeName和changeAge事件,可以直接修改用户的信息:
在这里插入图片描述

在点击按钮时,对应的pinia中保存的对象的值也发生改变。
在这里插入图片描述

4.2.2 通过$patch整体修改

//整体修改
const changeNameAndAge = () =>{user.$patch({name: names[randomInt(0, 4)],age: user.age + 1})console.log(user.name,user.age)
}

在这里插入图片描述

在这里插入图片描述

4.2.3 通过$patch函数式

user.$patch((state) => {    state.age = randomInt(1,100)state.name = checkName(state.age)})

在这里插入图片描述

4.2.4 通过$state整体修改

这种方式通常需要将state中的对象全部写上,否则会报错,所以一般不推荐使用。

  user.$state = {name: "法外狂徒张三",age: 30}

4.2.5 通过actions修改

修改src/store/index.ts中useUserStore中actions:
在这里插入图片描述

然后在vue端调用:

const changeNameAndAge4 = ()=>{user.setNameAndAge("张三",30)
}

4.2 解构store

直接解构Store中的对象时,是不具有响应式的,参考下图:
在这里插入图片描述

因此,为了具有响应式,需要添加pinia指定的组件storeToRefs。
第一步,先导入组件

import {storeToRefs} from "pinia"

第二步:在要解构的时候,将store对象包裹起来

const {name,age} = storeToRefs(user)

5 actions使用

模拟异步登录获取student信息

第一步,在store中定义异步方法getStudent

//定义数据类型
type Student = {name: string,grade: number
}//模拟登陆时,2秒后获取到student的值
const loginUser = (): Promise<Student> => {return new Promise((resolve) => {setTimeout(() => {resolve({name: "小明",grade: 3})}, 2000)})
}// 在actions中使用异步获取loginUser的数据
export const useStudentStore = defineStore("student", {state: () => {return {student: <Student>{}}},getters: {},actions: {async getStudent() {this.student = await loginUser()}}
})

异步查询时,通常都是async和await搭配一起使用的。

第二步,在vue中使用:

//student
const studentStore = useStudentStore()
const getStudentInfo = () => {studentStore.getStudent()
}

studentStore可以直接调用actions里面的方法getStudent()

除此之外,在actions中,方法也可以互相调用。

// actions中方法互调
// 当name参数有值时,就更新,否则使用登陆查询的值
export const useStudentStore = defineStore("student", {state: () => {return {student: <Student>{}}},getters: {},actions: {async getStudent(name:string|null) {this.student = await loginUser()this.updateStudent(name)},updateStudent(name:string|null){if(name){this.student.name = name}}}
})

6. getters使用

6.1 通过this获取

    getFullName():string {return `${this.student.name}大学${this.student.grade}年级`},

6.2 通过state获取

get的每个方法中都带有一个默认的state的参数,可以直接使用state来获取值

    getFullName2(state){return state.student.name + "大学" + state.student.grade + "年级"},

6.3 传参使用

由于默认的参数是state,所以要想传参,需要返回一个带参数的方法提供调用就可以。
这里需要写成=>形式。

    getFullName3: (state)=>{return (firstName:string)=>  firstName +"-" + state.student.name}

在vue中使用时,可以传入对应的firstName变量值。

<p>student fullName3: {{ studentStore.getFullName3("张姓:") }}</p>

7.API

7.1 重置state($reset)

重置state为初始化的状态:

const resetStudentInfo = () => studentStore.$reset()

7.2 $subscribe

当state里面的值被修改时,就会触发该事件,
所以当需要监听新旧的值时,可以在此添加一些对应的逻辑判断。

studentStore.$subscribe((args,state)=>{console.log("args===>",args)console.log("state===>",state)
})

在这里插入图片描述

7.3 $onActon

本身onAction是在调用到actions中的事件时触发。

studentStore.$onAction((args)=>{args.after(()=>{console.log("after")})console.log("onAction args===>",args)
})

但是也可以做更精细的控制,就是在actions中的某个事件执行完之后再触发。
在这里插入图片描述

比如上面的1,2先分别调用了actions中的setStudent,updateStudent事件。
然后,再分别调用了args.after这个方法。
这种可以用来处理在某个actions动作发生后,添加一些处理逻辑。

8. 持久化插件

8.1 插件安装

state中的值,在页面进行刷新后,会丢失修改的数据,所以需要借助了浏览器的存储来持久化。
安装插件

pnpm i pinia-plugin-persistedstate

在main.ts中引入插件

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import {createPinia} from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'  //引入let app = createApp(App)
const pinia = createPinia()
app.use(pinia)
pinia.use(piniaPluginPersistedstate) //使用app.mount('#app')

8.2 使用

第一种,简单使用,直接指定开启

export const useUserStore = defineStore(Names.USER, {state: () => {},getters: {},actions: {},persist: true //持久化开启
})

第二种: 指定自定义key

export const useUserStore = defineStore(Names.USER, {state: () => {},getters: {},actions: {},persist: {key: "my-custom-key" //自定义key}
})

第三种:组合式API方式的持久化,以及制定的存储类型

export const useSystemStore = defineStore(Names.SYSTEM, () => {const systemInfo = ref({ version: "win10" })function getMemory() {return "16G"}return { systemInfo, getMemory }
},{  //持久化,并自定义keypersist: {key: "my-custom-key",storage: sessionStorage,  //sessionStorage,localStorage,}}
)

8.3 局限性

8.3.1 引用类型可能会失效

下面这种情况,b是对a的引用。因此,b和a都是指向同一个地址。

const a = {1: 'one',2: 'two',// ...
}
const b = a

序列化之前,a===b 结果是true

在持久化之后,由于数据将会被序列化,因此引用在刷新时将会丢失。

再次反序列化之后,a和b有着相同的内容,但是指向的是不同的对象。
a === b 结果为false

解决方法:
采取避免 a 或 b 被持久化的方法(使用 paths 选项),
并使用 afterRestore 钩子在恢复数据后重新存储它们。
这样 a 和 b 就又会有着相同的引用,两者之间的联系就恢复了。

8.3.2 基本数据类型之外的不会被序列化

解决方法:
使用 afterRestore 钩子在恢复数据后重新创建对象。
使用自定义的 serializer 来配置你想要持久化的数据类型。

8.4 全局配置

使用createPersistedState来进行全局配置。

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import {createPinia} from 'pinia'
// import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import { createPersistedState } from 'pinia-plugin-persistedstate'let app = createApp(App)
const pinia = createPinia()
app.use(pinia)
// pinia.use(piniaPluginPersistedstate)pinia.use(createPersistedState({storage: sessionStorage,key: id => `__persisted__${id}`,auto: true,})
)

全局配置以后,可以不需要在每个store中再额外配置,但是可以指定的store中禁用持久化。

import { defineStore } from 'pinia'
defineStore('not-persisted', {state: () => ({ saved: '' }),persist: false, //显示指定某个store不持久化
})

也可以为单独的state中变量分别指定持久化方式:

import { defineStore } from 'pinia'
defineStore('store', {state: () => ({toLocal: '',toSession: '',toNowhere: '',}),persist: [{paths: ['toLocal'],storage: localStorage,},{paths: ['toSession'],storage: sessionStorage,},],
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Collection

Collection接口常用方法 ①添加&#xff1a; ​ add(Object obj):只要是对象都可以添加 ​ addAll(Collection c)&#xff1a;添加另一个集合的元素 ②删除&#xff1a; ​ clear():清空集合元素 ​ remove(Object obj)删除某个元素对象 ​ removeAll(Collection c)&…

熔断、限流、降级 —— SpringCloud Alibaba Sentinel

Sentinel 简介 Sentinel 是阿里中间件团队开源的&#xff0c;面向分布式服务架构的高可用流量防护组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性 Sentinel 提供了两个服务组件…

【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)

一&#xff0c;VMware下载地址&#xff1a; 百度网盘链接链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https:/…

初识jmeter及简单使用

目录 1、打开页面&#xff1a; 2、添加线程组&#xff1a; 3、线程组中设置参数&#xff1a; 4、添加请求 5、添加一个http请求后&#xff0c;设置请求内容 6、添加察看结果树 7、执行&#xff0c;查看结果 一般步骤是&#xff1a;在测试计划下面新建一个线程组&#xf…

postgresql-备份与恢复

postgresql-备份与恢复 基本概念备份类型物理备份与逻辑备份在线备份与离线备份全量备份与增量备份 备份恢复工具备份与恢复逻辑备份与还原备份单个数据库psqlpg_dumppg_store 备份整个集群 基本概念 服务器系统错误、硬件故障或者人为失误都可能导致数据的丢失或损坏。因此&am…

一文全面解读CKA认证的含金量、详细介绍!

K8s是目前最流行的开源容器编排引擎&#xff0c;在全球都得到了广泛应用&#xff0c;BAT、京东、360、华为、网易、IBM、知乎等国内外诸多知名公司都在基于K8s构建企业容器云平台&#xff0c;支撑公司业务&#xff0c;越来越多的企业也都在向K8s迁移。相信在不远的将来&#xf…

日期相关工具类

日期相关工具类 【一】介绍【1】SimpleDateFormat 为什么是线程不安全【2】解决 SimpleDateFormat 线程不安全的方法 【二】LocalDate API【三】LocalTime API【四】LocalDateTime API【五】转换关系【1】LocalDateTime 与 LocalDate 之间的转换【2】LocalDateTime 与 Date 之间…

华为云云耀云服务器L实例评测|Elasticsearch的可视化Kibana工具安装 IK分词器的安装和使用

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍Elasticsearch的可视化Kibana工具安装&#xff0c;以及IK分词器的安装和使用。 其他相关的Elasticsea…

电影产业的数据洞察:爬虫技术在票房分析中的应用

概述 电影产业是一个庞大而复杂的行业&#xff0c;涉及到各种各样的因素&#xff0c;如导演、演员、类型、主题、预算、宣传、口碑、评分、奖项等。这些因素都会影响电影的票房收入&#xff0c;也会反映出电影市场的动态和趋势。为了更好地了解电影产业的数据洞察&#xff0c;…

华为云云耀云服务器L实例评测|RabbitMQ的Docker版本安装 + 延迟插件安装 QQ邮箱和阿里云短信验证码的主题模式发送

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍RabbitMQ的Docker版本安装和配置&#xff0c;延迟插件的安装&#xff1b;结合QQ邮箱和阿里云短信验证码…

CMMI5认证哪些企业可以申请

CMMI5认证哪些企业可以申请 什么是CMMI5认证 CMMI&#xff08;Capability Maturity Model Integration&#xff09;是一种用于评估组织的软件工程能力的国际标准。CMMI模型包括5个等级&#xff0c;其中CMMI5是最高等级&#xff0c;代表组织具有达到持续优化和创新的能力。获得…

Elasticsearch:多语言语义搜索

在此示例中&#xff0c;我们将使用多语言嵌入模型 multilingual-e5-base 对混合语言文档的 toy 数据集执行搜索。 使用这个模型&#xff0c;我们可以通过两种方式进行搜索&#xff1a; 跨语言&#xff0c;例如使用德语查询来查找英语文档在非英语语言中&#xff0c;例如使用德…

【计算机网络】高级IO初步理解

文章目录 1. 什么是IO&#xff1f;什么是高效 IO? 2. IO的五种模型五种IO模型的概念理解同步IO与异步IO整体理解 3. 阻塞IO4. 非阻塞IOsetnonblock函数为什么非阻塞IO会读取错误&#xff1f;对错误码的进一步判断检测数据没有就绪时&#xff0c;返回做一些其他事情完整代码myt…

Flutter笔记 - ListTile组件及其应用

Flutter笔记 ListTile组件及其应用 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133411883 目 录 1. …

计算机毕设 大数据工作岗位数据分析与可视化 - python flask

文章目录 0 前言1 课题背景2 实现效果3 项目实现3.1 概括 3.2 Flask实现3.3 HTML页面交互及Jinja2 4 **完整代码**5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要…

R实现数据分布特征的视觉化——多笔数据之间的比较

大家好&#xff0c;我是带我去滑雪&#xff01; 如果要对两笔数据或者多笔数据的分布情况进行比较&#xff0c;Q-Q图、柱状图、星形图都是非常好的选择&#xff0c;下面开始实战。 &#xff08;1&#xff09;绘制Q-Q图 首先导入数据bankwage.csv文件&#xff0c;该数据集…

VSC-HVDC直流输电matlab仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; VSC-HVDC直流输电仿真&#xff0c;换流站采用两电平结构&#xff0c;全控型器件&#xff08;IGBT&#xff09;&#xff0c;采用双环控制&#xff0c;包括电压外环&#xff0c;电流内环&#xff0c;分为d、q两…

使用关键字abstract 声明抽象类-PHP8知识详解

抽象类只能作为父类使用&#xff0c;因为抽象类不能被实例化。抽象类使用关键字abstract 声明&#xff0c;具体的使用语法格式如下&#xff1a; abstract class 抽象类名称{ //抽象类的成员变量列表 abstract function 成员方法1(参数); //抽象类的成员方法 abstract functi…

网络基础知识面试题1

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)

GPU(国内外发展,概念参数(CUDA,Tensor Core等),类别,如何选型,NPU,TPU)

目录 前言 1.国内外GPU发展简述 2.GPU概念参数和选择标准 2.1 CUDA 2.2 Tensor Core 2.3 显存容量和显存位宽 2.4 精度 2.5 如何选择GPU 3.常见GPU类别和价格 3.1 GPU类别 3.2 GPU价格&#xff08;部分&#xff09; 3.3 GPU云服务器收费标准&#xff08;以阿里云为例&a…