pinia--vue3中的状态管理

一、Pinia是什么?

Pinia 是 Vue 的存储库,它允许跨组件/页面共享状态。实际上,pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia,而没有取名Vuex,所以大家可以直接将pinia比作为Vue3的Vuex。

二、为什么要使用pinia?

pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑减少了我们工作量。

pinia中action支持同步和异步,Vuex不支持

良好的Typescript支持,毕竟我们Vue3都推荐使用TS来编写,这个时候使用pinia就非常合适了

无需再创建各个模块嵌套了,Vuex中如果数据过多,我们通常分模块来进行管理,稍显麻烦,而pinia中每个store都是独立的,互相不影响。

体积非常小,只有1KB左右。

pinia支持插件来扩展自身功能。

支持服务端渲染。

三、Pinia 基础特性

1、State

(1)默认情况下,通过 store 实例访问 state,可以直接读取和写入,如 @click="store.count++"

(2)通过 store.$reset() 方法可以将 state 重置为初始值。

(3)除了直接通过 store 修改 state,还可以通过 store.$patch() 方法提交多个更改。

(4)可以通过 store.$subscribe() 订阅 State 的变化,在 patches 修改之后订阅只会触发一次。默认情况下,订阅绑定到添加它的

组件,当组件卸载时,它们将自动删除,也可以配置将其保留。

2、Getters

(1)Getters 属性的值是一个函数,接受 state 作为第一个参数,目的是鼓励使用箭头函数

(2)非箭头函数会绑定 this,建议仅在需要获取整个 store 实例的场景使用,且需要显式定义函数返回类型

3、Actions

(1)与 Gettes 一样可以通过 this 访问整个 store 实例

(2)Actions 可以是异步的或同步的,不管怎样,都会返回一个 Promise

(3)Actions 可以自由的设置参数和返回的内容,一切将自动推断,不需要定义 TS 类型

(4)与 State 一样,可以通过 store.$onAction() 订阅 Actions,回调将在执行前触发,并可以通过参数 after() 和 onError() 允许在Action 决议后和拒绝后执行函数。同样的,订阅绑定的是当前组件。

四、Pinia 中关于 TypeScript 类型推断。

Pinia 默认提供良好的 TypeScript 支持,但是要想获得完整的类型推断,需要遵循一些使用建议:

1、声明 state 建议使用箭头函数,会自动推断属性的类型。如果使用非箭头函数,在 getters 中使用形参 state 访问属性TypeScript 无法识别

const useStore = defineStore('main', {// 使用非箭头函数定义state() {return {count: 0}},getters: {// 使用 state 访问状态doubleCount(state) { return state.count * 2}},actions: {increment() {this.count++}}
})

2、声明 Getters 属性建议使用 state 参数访问状态(箭头函数或非箭头函数),非箭头函数虽然可以使用 this ,但不会自动推断类型(当没有声明 state 形参,或 state 使用非箭头函数定义时)

为了避免使用 this,官方建议使用箭头函数

建议仅当需要获取整个 store 时使用 this,但必须显式的定义函数返回类型,TypeScript 不会自动推断

建议使用 this 的时候不要声明 state 形参

const useStore = defineStore('main', {state: () => ({count: 0}),getters: {doubleCount() {return this.count * 2},// 解决办法1doubleCount2(state) {return this.count * 2},// 解决办法2doubleCount3():number {return this.count * 2}},actions: {increment() {this.count++}}
})

五、Pinia的函数

1、createPinia(): Pinia。

        创建一个被应用所使用的 Pinia 实例。返回:Pinia

2、defineStore(id, options): StoreDefinition。

        创建一个检索 store 实例的 useStore 函数。

参数

名称

类型

描述

useStore

StoreDefinition

要映射的存储

keyMapper

KeyMapper

为actions定义新名称的对象

 例如:

export default {methods: {// 其他方法属性// useCounterStore 有两个操作(action),分别叫做 `increment` 和 `setCount`...mapActions(useCounterStore, { moar: 'increment', setIt: 'setCount' })},created() {this.moar()this.setIt(2)}
}

3、mapState(useStore, keyMapper): _MapStateObjectReturn。

        通过生成要在组件的 computed 字段中展开的对象,以允许从一个没有使用组合式 API (setup()) 的 store 使用 state 和 getters 对象的值是状态 properties/getters ,而键是结果计算属性的名称。您也可以传递一个自定义函数,该函数将接收 store 作为其第一个参数。请注意,虽然它可以通过这个访问组件实例,但它不会识别类型。

参数

名称

类型

描述

useStore

StoreDefinition

要映射的存储

keyMapper

KeyMapper

状态(state)属性或访问器(getter)的对象

例如:

export default {computed: {// 其它计算属性// useCounterStore 有一个 state 属性叫做 `count` 和一个 getter 叫做 `double`...mapState(useCounterStore, {n: 'count',triple: store => store.n * 3,// 注意如果我们想使用 `this` 则不能使用箭头函数custom(store) {return this.someComponentValue + store.n},doubleN: 'double'})},created() {this.n // 2this.doubleN // 4}
}

4、mapStores(…stores): _Spread。

        通过生成要在组件的 computed 字段中展开的对象,允许使用没有组合式API (setup())的存储。它接受 store 定义的列表。

参数

Name

Type

描述

...stores

[…Stores[]]

要映射到对象的存储(store)列表

例如:

export default {computed: {// 其它计算属性...mapStores(useUserStore, useCartStore)},created() {this.userStore // id为"user"的存储this.cartStore // id为"cart"的存储}
}

 5、 storeToRefs(store): ToRefs。

        用 store 的所有state、getters和 插件添加的(plugin-added)state、 属性(properties)创建一个引用对象。类似于toRefs(),但专门为 Pinia store 设计

参数:

名称

类型

描述

store

SS

用以提取refs的 store

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

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

相关文章

Mybatis 日志配置

要查看MyBatis的日志语句,您可以在一个包、一个完全限定的映射器类名、一个命名空间或一个完全限定的语句名称上启用日志记录。 再次强调,如何做这取决于所使用的日志实现。我们将展示如何在SLF4J(Logback)中进行配置。配置日志服务只需添加一个或多个额…

zdppy_api框架快速入门

概述 zdppy_api是一款为了快速开发而生的,基于异步的,使用简单的Python后端API接口开发框架。 本框架的目标是让Python后端开发变得越来越简单,直到发现原来还可以更简单! 一切都是为了提高开发效率!!&…

标题:探索C语言中的While循环结构

各位少年: 在C语言编程中,循环是一种强大的工具,它允许我们重复执行一段代码,直到满足特定的条件为止。其中,while循环是一种常用的循环结构,它以其简洁的语法和灵活的应用场景赢得了程序员们的青睐。下面…

隧道代理HTTP工作原理:一场奇妙的网络魔法表演

嘿,小伙伴们!今天我们要一起探索一个有趣的话题——隧道代理HTTP的工作原理。这不是普通的表演,而是一场奇妙的网络魔法表演! 首先,让我们想象一下,网络世界就像一个大舞台,而我们每个人都是这…

RK3566 Android 11平台上适配YT8512C 100M PHY

RK3566代码之前适配的1000M IC RTL8211F , 现在需要在之前的基础上修改PHY IC 为裕泰的YT8512C ----------------------------------------------------------------------//将1000M 的配置关掉,改为100M 配置,查看RK3566 资料关于以太网的配置即可知道如何修改 #if…

Linux驱动开发简易流程

推荐视频: 正点原子【第四期】手把手教你学 Linux之驱动开发篇 小智-学长嵌入式Linux&Android底层开发入门教程 能力矩阵 基础能力矩阵 熟悉c/c、熟悉数据结构 熟悉linux系统,Shell脚本,Makefile/cmake/mk 文件IO、多线程、竞争、并发…

AutoSAR(基础入门篇)3.1-Autosar中RTE的概述

目录 一、RTE概述 1、什么是RTE 2、RTE的作用 二、RTE对Runnables的运行支撑 1、作为运行环境的主要功能点

Kubernetes 网络架构

大家好,我是升仔 Kubernetes 网络架构概览 Kubernetes 网络架构的设计理念是简化容器间的通信,确保 Pods 间可以无障碍通信,同时对外提供访问服务的机制。这一设计理念贯穿于整个网络架构。 Pod 网络模型 基本概念:在 Kuberne…

深度优先和广度优先

文章目录 前言一、深度和广度的区别二、代码演示1.准备数据,构造树2.深度优先遍历3.广度优先遍历 总结 前言 深度优先和广度优先的区别: 搜索方式不同 。深度优先搜索算法不全部保留结点,扩展完的结点从数据库中弹出删去;广度优先搜索算法需…

oracle-sga-shared_pool

shared pool 缓冲sql语句和执行计划 shared pool由三部分组成 free libray:缓存sql执行计划 row cathe :缓存数据字典 硬解析:1判断语法2判断对象是否存在3有没有权限4 从n个执行方案中选出最优解,生成执行计划,这一…

壮志酬筹>业务被裁>副业转正>收入回正。一个前黑马程序员老师的2023

从年初时的踌躇满志,到年中时整个业务线被砍。全职做前端训练营,四个多月的时间帮助100多名同学拿到了满意的offer,同时也让我的收入重归正轨。仅以这个视频记录我,一个普通程序员的 2023 。 视频版可直接访问 Hello,大…

Linux基础知识-命令

Linux的基础命令: 1.登录及其用户 sudo //使用超管权限(没登录之前); sudo useradd -m //创建一个xx用户; userdel (-r)(-f&a…

基于ElementUI二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…

JavaScript:正则表达式

JavaScript&#xff1a;正则表达式 什么是正则表达式正则表达式语法定义正则表达式判断是否有匹配的字符串查找匹配的字符串 正则表达式匹配法则元字符边界符量词字符类 什么是正则表达式 正则表达式用于匹配字符串中字符的组合模式。 正则表达式会依据其自身语法&#xff0c;…

2023 搞懂git 工作目录---暂存区---本地仓库---版本库

最近了解了下git的底层原理&#xff08;大神录制的视频放在最下方&#xff09;&#xff0c;记录下&#xff1a; 工作区 就是存放待提交文件的目录&#xff08;下图图解标注&#xff09;比如pyhon_test目录暂存区 .git目录下的index文件 对应的指令 git add本地仓库 .gi…

【操作系统】测试五

文章目录 单选题填空题 单选题 可以实现虚拟存储器的方案是。 【正确答案&#xff1a;D】 A. 固定分区方式 B. 可变分区方式 C. 纯分页方式 D. 请求页式 哪种设备属于字符设备&#xff1f; 【 正确答案&#xff1a;D】 A. 磁盘 B. 磁带 C. 光盘 D. 键盘 哪种设备属于块设备&a…

图片格式 WebP、JPEG、PNG、SVG 及转换

文章目录 图片格式 WebP、JPEG、PNG、SVG 及转换1. 图片格式1.1 WebP1.2 JPEG1.3 PNG1.4 SVG1.5 ... 2. 格式转换2.1 Python 批量转 WebP2.2 在线转换工具2.2.1 Shutterstock2.2.2 PicWish2.2.3 MyEdit2.2.4 Freeconvert2.2.5 iLoveIMG Reference 图片格式 WebP、JPEG、PNG、SV…

数据压缩专题——静止图像的小波变换编码

随着数字图像技术的发展和应用的广泛&#xff0c;对图像的压缩和编码变得越来越重要。小波变换编码作为一种有效的图像压缩和编码方法&#xff0c;在静止图像处理中得到了广泛应用。本文将介绍静止图像的小波变换编码的基本原理和关键步骤&#xff0c;以及其在图像压缩中的应用…

nginx+keepalived实现七层负载

目录 一、部署nginx01、nginx02 二、keepalived配置&#xff08;抢占模式、master- backup模式&#xff09; 三、测试 四、非抢占模式&#xff08;backup-backup模式&#xff09; nginx01 11.0.1.31nginx0211.0.1.32虚拟IP&#xff08;VIP&#xff09;11.0.1.30 一、部署ngin…

java使用JSON工具解析字符串、数组详解

一&#xff1a;问题 1.最近自己在前后端数据交互时需要进行JSON格式字符串、数组数据进行转换&#xff0c;进行问题整理 2.遇到需要JSON字符串转换的朋友可以阅读 二&#xff1a;解析步骤 1.第一点首先确定需求&#xff0c;明确需要转的字符串是一个对象还是一个数组&#…