vue3学习-Pinia状态管理
Pinia
定义一个Store
import { defineStore } from 'pinia'
export const useStore = defineStore('main', {})
这个 name,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。
将返回的函数命名为 use… 是跨可组合项的约定,以使其符合你的使用习惯。
使用 store
import { useStore } from '@/stores/counter'
const storeObj = useStore()
console.log(storeObj.count)
一旦 store 被实例化,你就可以直接在 store 上访问 state
、getters
和 actions
中定义的任何属性
store
是一个用reactive
包裹的对象,这意味着不需要在getter 之后写.value
,就像
setup
中的props
一样,我们不能对其进行解构
为了从 Store 中提取属性同时保持其响应式,您需要使用storeToRefs()
import { useStore } from '@/stores/counter'
const { count } = useStore()
console.log(count)//失去响应#解决
import { storeToRefs } from 'pinia'
const { count } = storeToRefs(useStore())
console.log(count.value)
state
在 Pinia 中,状态被定义为返回初始状态的函数。
const useStore = defineStore('main', {state: () => {return {count: 0}
})
访问“state”
const storeObj = useStore()
store.count++
重置状态
const storeObj = useStore()
storeObj.$reset()
改变状态
可以之恶杰修改: store.count++
可以调用 $patch 方法
storeObj.$patch({otherProp: 'main'//其他属性count: storeObj.count + 1
})
或
storeObj.$patch((state) => {state.item.push({name: 'RenNing', age: 18})state.count = ++state.count
})
$patch
方法也接受一个函数来批量修改集合内部分对象的情况
替换state
store.$state = { counter: 666, name: 'Paimon' } //{ counter: 666, name: 'Paimon' }
store.$state = {}
只针对原定义好的属性,未定义的数据虽然会添加上,但是不起作用
订阅状态
通过 store 的 $subscribe()
方法查看状态及其变化
与常规的 watch()
相比,使用 $subscribe()
的优点是 subscriptions 只会在 patches 之后触发一次
storeObj.$subscribe((mutation, state) => {// import { MutationType } from 'pinia'mutation.type // 'direct' | 'patch object' | 'patch function'// 与 cartStore.$id 相同mutation.storeId // 'cart'// 仅适用于 mutation.type === 'patch object'mutation.payload // 补丁对象传递给 to cartStore.$patch()// 每当它发生变化时,将整个状态持久化到本地存储localStorage.setItem('cart', JSON.stringify(state))
})
认情况下,state subscriptions 绑定到添加它们的组件
当组件被卸载时,它们将被自动删除
如果要在卸载组件后保留它们,请将 { detached: true }
作为第二个参数传递给 detach 当前组件的 state subscription
storeObj.$subscribe(callback, {detached: true})
您可以在
pinia
实例上查看整个状态:watch(pinia.state,(state) => {// 每当它发生变化时,将整个状态持久化到本地存储localStorage.setItem('piniaState', JSON.stringify(state))},{ deep: true } )
getter
用 defineStore()
中的 getters
属性定义。
接收“状态”作为第一个参数以鼓励箭头函数的使用
export const useStore = defineStore('count', {state: () =>{{count: 1}},getters: {//方法一doubleCount: (state) => {return state.count * 2},//方法二doublePlusOne(): number { return this.counter * 2 + 1 },}
})
将参数传递给 getter
# 定义
getters: {getUserId(state) =>{const arr = state.foo.filter(....)return (userId) => arr.find(id => userId == id)}
}
#使用
{{getUserId(2)}}
执行此操作时,getter 不再缓存,它们只是您调用的函数。
但是,您可以在 getter 本身内部缓存一些结果
反问其他Store的getter
import {useOtherStore} from './other-sotre'
getters: {otherGetter(state) {const otherStore = useOtherStore()return state.localDate + otherStore.data}
}
没有setup()
import { mapState } from 'pinia'
computed:{...mapState(useCounterStroe, ['doubleCount'])
}
Actions
相当于组件中的methods。适合定义业务逻辑
export const useStore = defineStore('main', {actions: {increment() {this.count++},async getApi() {try{let res = await post('url',options)}catch{}}},})
与 getters 一样,操作可以通过 this
访问
actions
可以是异步的
调用
Actions 像 methods 一样被调用:
useStore.getApi()
不适用 setup()
可以使用 mapActions()
将操作属性映射为组件中的方法
import { mapActions } from 'pinia'
import { getApi } from '../stores/useStore.js'
methods:{...mapActions(getApi)
}
订阅Actions
使用 store.$onAction()
订阅 action 及其结果
const unsubscribe = someStore.$onAction(({name, // action 的名字store, // store 实例args, // 调用这个 action 的参数after, // 在这个 action 执行完毕之后,执行这个函数onError, // 在这个 action 抛出异常的时候,执行这个函数}) => {// 记录开始的时间变量const startTime = Date.now()// 这将在 `store` 上的操作执行之前触发console.log(`Start "${name}" with params [${args.join(', ')}].`)// 如果 action 成功并且完全运行后,after 将触发。// 它将等待任何返回的 promiseafter((result) => {console.log(`Finished "${name}" after ${Date.now() - startTime}ms.\nResult: ${result}.`)})// 如果 action 抛出或返回 Promise.reject ,onError 将触发onError((error) => {console.warn(`Failed "${name}" after ${Date.now() - startTime}ms.\nError: ${error}.`)})}
)// 手动移除订阅
unsubscribe()
调用方法时/后触发
默认情况下,action subscriptions 绑定到添加它们的组件,默认情况下,action subscriptions 绑定到添加它们的组件。
如果要在卸载组件后保留它们,请将 true
作为第二个参数传递给当前组件的 detach action subscription
// 此订阅将在组件卸载后保留
someStore.$onAction(callback, true)
相关文章:
vue3学习-Pinia状态管理
Pinia 定义一个Store import { defineStore } from pinia export const useStore defineStore(main, {})这个 name,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use… 是跨可组合项的约定࿰…...

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用
TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用 TextBrewer是一个基于PyTorch的、为实现NLP中的知识蒸馏任务而设计的工具包, 融合并改进了NLP和CV中的多种知识蒸馏技术࿰…...

乍得ECTN(BESC)申请流程
根据TCHAD/CHAD乍得法令,自2013年4月1日起,所有运至乍得的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请,将被视为触犯乍得的条例,并在目的地受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称;…...

【100天精通python】Day28:文件与IO操作_JSON文件处理
目录 专栏导读 1. JSON数据格式简介 1.1 示例JSON数据 1.2 JSON文件的特点 2 json模块的常用操作 2.1 读写JSON文件的示例 2.2 解析JSON字符串 2.3 修改JSON数据 2.4 查询和操作嵌套数据 2.5 处理包含特殊字符的JSON文件 2.6 处理日期和时间 2.7 处理大型JSON文…...

配置两台数据库为主从数据库模式
一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID,保证整个集群环境中唯一,默认为1server-id1#是否只读,1代表只读,0代表读写read-only0#忽略的数据,指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…...
linux允许root远程ssh登录
修改文件/etc/ssh/sshd_config # cat /etc/ssh/sshd_config ... #LoginGraceTime 2m #PermitRootLogin prohibit-password #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 ...将 #PermitRootLogin prohibit-password标注为: PermitRootLogin yes样例…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)
Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量(C) Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…...

Spring @Scheduled单线程单实例的坑
文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。 其他相关文章࿱…...
7-数据结构-(带头节点)单链表的增删改查
问题: 单链表带头结点的创建以及输出,以及带与不带头节点的区别 思路: 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。带头节点是为…...

每天一道leetcode:剑指 Offer 53 - II. 0~n-1中缺失的数字(适合初学者二分查找)
今日份题目: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例1 输入: [0,1,3] 输出: 2 示例2 …...

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包
目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包,当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…...

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】——“cpolar内网穿透”
配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 创建一条固定数据隧道2. 找到“保留二级子域名”栏位3. 重新编辑之前建立的临时数据隧道4. 进入“在线隧道列表”页面5. 在其他浏览器访问…...

【枚举】CF1706 C
有人一道1400写了一个小时 Problem - C - Codeforces 题意: 思路: 首先先去观察样例: 很显然,对于n是奇数的情况,只有一种情况,直接操作偶数位就好了 主要是没搞清楚n是偶数的情况 其实有个小技巧&…...

uniapp-疫情应急管理系统学生端
1 疫情资讯展示 <template><view class"container"><uni-section title"自定义卡片内容" type"line"><uni-card title"基础卡片" class"card-box" v-for"(item,index) in epidemicNewsList"…...

FreeRTOS的线程间通信
一、分类 FreeRTOS的线程间通信分为这几大类 由于我还在学习中,目前显从信号开始记录学习 二、逐块讲解 1、信号(osSignalWait osSignalSet) FreeRTOS从V8.2.0版本开始提供任务通知这个功能,每个任务多有一个32位的通知值&am…...

Linux内存管理工作原理:
Linux使用虚拟内存和内存映射来管理内存。每个进程都有独立的虚拟地址空间,通过将虚拟地址映射到物理内存,实现对内存的管理和访问。 虚拟地址空间划分:32位系统中,内核空间占1GB,用户空间占3GB;64位系统中…...

【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架
并发,数据同步往往是业务开发中比较重要的部分。 shenyu网关数据同步设计方案图 shenyu官网给出的同步设计方案图如下: 基于事件异步并发框架com.lmax.disruptor 下载下示例代码,跑起来发现,在shenyuAdmin模块里面用到了com.lma…...

Nginx(2)
目录 1.安装Nginx1.yum安装2.编译安装3.Nginx命令 2.配置文件详解 1.安装Nginx 1.yum安装 [rootdocker ~]# yum -y install nginx通过 rpm -ql nginx 查看安装信息 2.编译安装 2.1安装所需要的依赖 yum install -y gcc gcc-c make libtool wget pcre pcre-devel zlib zlib-…...
二维数组的鞍点
描述 给定一个二维数组,找出其中的鞍点。若存在鞍点,则输出其位置;否则输出“NO”。 鞍点的定义:在一个矩阵的行和列中,某个元素是所在行的最大值,而同列中又是最小值。 输入 输入包含多行,…...
go 内置函数copy()
go内置函数copy go 内置函数copy()函数说明:代码例子1:代码例子2:代码例子3: go 内置函数copy() 函数说明: 当我们在Go语言中需要将一个切片的内容复制到另一个切片时,可以使用内置的copy()函数。copy()函…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...