当前位置: 首页 > news >正文

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 上访问 stategettersactions 中定义的任何属性

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… 是跨可组合项的约定&#xff0…...

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用

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

乍得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样例&#xf…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

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

Spring @Scheduled单线程单实例的坑

文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景,有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题,刷新了我的认知,分享给大家。 其他相关文章&#xff1…...

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的线程间通信分为这几大类 由于我还在学习中&#xff0c;目前显从信号开始记录学习 二、逐块讲解 1、信号&#xff08;osSignalWait osSignalSet&#xff09; FreeRTOS从V8.2.0版本开始提供任务通知这个功能&#xff0c;每个任务多有一个32位的通知值&am…...

Linux内存管理工作原理:

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

【并发编程】ShenyuAdmin里面数据同步用到的无锁环形队列LMAX Disruptor并发框架

并发&#xff0c;数据同步往往是业务开发中比较重要的部分。 shenyu网关数据同步设计方案图 shenyu官网给出的同步设计方案图如下&#xff1a; 基于事件异步并发框架com.lmax.disruptor 下载下示例代码&#xff0c;跑起来发现&#xff0c;在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-…...

二维数组的鞍点

描述 给定一个二维数组&#xff0c;找出其中的鞍点。若存在鞍点&#xff0c;则输出其位置&#xff1b;否则输出“NO”。 鞍点的定义&#xff1a;在一个矩阵的行和列中&#xff0c;某个元素是所在行的最大值&#xff0c;而同列中又是最小值。 输入 输入包含多行&#xff0c;…...

go 内置函数copy()

go内置函数copy go 内置函数copy()函数说明&#xff1a;代码例子1&#xff1a;代码例子2&#xff1a;代码例子3&#xff1a; go 内置函数copy() 函数说明&#xff1a; 当我们在Go语言中需要将一个切片的内容复制到另一个切片时&#xff0c;可以使用内置的copy()函数。copy()函…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API&#xff0c;让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API&#xff0c;你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...