vue3如何使用pinia设置全局状态,附常见面试题
1. stores/index.ts
文件
在 index.ts
中创建 store
实例并封装了注册逻辑,这样可以方便地将整个 Pinia 实例注册到 Vue 应用中。代码如下:
import type { App } from 'vue'
import { createPinia } from 'pinia'const store = createPinia()// 全局注册 store
export function setupStore(app: App<Element>) {app.use(store)
}export * from './modules/blockAuthor'
createPinia
实例化了一个 Pinia 状态管理对象。setupStore
函数将 store 注册到传入的 Vue 应用实例app
上,使得整个应用都可以访问到 store。export * from './modules/blockAuthor'
导出了blockAuthor
模块中定义的内容,这样其他文件就可以直接从stores
中引入它。
2. stores/modules/blockAuthor.ts
文件
blockAuthor.ts
定义了一个具体的 store,用于管理用户的“网格权限”。具体代码如下:
import { defineStore } from 'pinia'
import { StoreName } from '../storesName'
import { ref } from 'vue'
import { sysGridAPI } from '@/api/gridBlock/api'export const useBlockAuthorStore = defineStore(StoreName.BLOCKAUTHOR, () => {/*** 用户网格权限*/const authorList = ref([])/*** 更新 userBlockAuthor*/async function updateUserBlockAuthor() {try {const res = await sysGridAPI.findGridBlockByUser()authorList.value = res.data.map((item) => item.id)console.log('pinia-store: updateUserBlockAuthor', updateUserBlockAuthor)} catch (error) {console.error('Failed to update user block author:', error)}}updateUserBlockAuthor()return {authorList}
})
authorList
是一个ref
类型的响应式数组,用于保存用户的权限列表。updateUserBlockAuthor
是一个异步函数,调用sysGridAPI.findGridBlockByUser()
接口获取用户权限数据并将其存入authorList
中。- 最后返回了
authorList
,使得在其他组件中可以访问。
3. 在组件中使用
你在组件中这样使用 useBlockAuthorStore
:
import { useBlockAuthorStore } from '@/stores'const authorList = authorStore.authorList
useBlockAuthorStore
通过 import
引入,并使用后即可访问 authorList
等数据,组件内就可以通过 authorList
实现响应式的数据展示或操作。
4. stores/storesName.ts
这种做法有助于集中管理 store 名称,使得在多个文件中引用 store 时保持一致,避免了硬编码字符串带来的拼写错误风险。这种方式非常适合在项目中有多个 store 模块时使用,便于维护和扩展。
export const enum StoreName {BLOCKAUTHOR = 'blockAuthor'
}
解释
const enum
是 TypeScript 提供的特性,用于定义常量枚举,它会在编译时直接内联字符串值(如'blockAuthor'
),减少运行时的额外代码开销。BLOCKAUTHOR
是一个键,'blockAuthor'
是它的值。通过这种方式,BLOCKAUTHOR
可以直接代表'blockAuthor'
字符串。
好处
- 避免硬编码字符串:在代码中不直接写
'blockAuthor'
,而是通过StoreName.BLOCKAUTHOR
来引用,这样减少了手动输入字符串带来的错误。 - 提升可读性:通过在枚举中添加注释,可以清晰表达每个值的含义。
- 提高性能:
const enum
在编译时会直接替换为对应的字符串,不会生成多余的对象,因此性能更好。
面试题
1. Pinia 是什么?为什么要用它?
- 答:Pinia 是 Vue 3 的官方状态管理库,它是 Vuex 的替代品,专为 Vue 3 和 Composition API 设计。与 Vuex 相比,Pinia 提供了更简洁的 API,更好的 TypeScript 支持,以及更小的体积和更高的性能。它允许我们定义 store、管理状态和处理逻辑,使得 Vue 应用的状态管理更加灵活、模块化和可扩展。
2. 如何在 Vue 3 中使用 Pinia?
- 答:在 Vue 3 中使用 Pinia,首先需要创建 Pinia 实例并将其传递给 Vue 应用。然后,可以通过
defineStore
定义 store,并通过useStore
在组件中访问 store。- 步骤:
- 在
main.ts
中创建 Pinia 实例并注册:import { createPinia } from 'pinia' const pinia = createPinia() app.use(pinia)
2. 使用
defineStore
定义一个 store:import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {state: () => ({name: 'John Doe',age: 30}),actions: {setName(name: string) {this.name = name}} })
3. 在组件中使用 store:
import { useUserStore } from '@/stores/user'const userStore = useUserStore() userStore.setName('Jane Doe') console.log(userStore.name)
3. Pinia 与 Vuex 有什么区别?
- 答:Pinia 和 Vuex 都是用于管理全局状态的库,但它们有一些关键区别:
- 响应式系统:Pinia 使用 Vue 3 的 Proxy 实现响应式,性能和灵活性上更优。Vuex 使用
Object.defineProperty
,相比之下不如 Pinia 高效。 - API 设计:Pinia 的 API 更简洁、直观。它使用 Composition API 风格,支持
defineStore
和直接返回对象的方式来定义 store,而 Vuex 更加偏向于 options API 风格。 - TypeScript 支持:Pinia 提供了更好的 TypeScript 支持,能够更好地推导类型,减少手动声明类型的需求。
- 模块化:Pinia 的 store 是通过
defineStore
定义的,每个 store 都是一个独立的模块,具有清晰的结构。
- 响应式系统:Pinia 使用 Vue 3 的 Proxy 实现响应式,性能和灵活性上更优。Vuex 使用
-
4. 如何在 Pinia 中使用异步操作?
- 答:在 Pinia 中,异步操作通常通过
actions
来处理。在actions
中定义异步函数,可以像操作同步数据一样处理异步逻辑。示例如下:import { defineStore } from 'pinia' import { api } from '@/api'export const useUserStore = defineStore('user', {state: () => ({userData: null}),actions: {async fetchUserData() {try {const response = await api.getUserData()this.userData = response.data} catch (error) {console.error('Failed to fetch user data', error)}}} })
5. 如何在 Pinia 中使用 getters?
- 答:Pinia 支持使用 getters 来派生状态数据。getters 允许我们定义基于状态的计算值。例如,如果你有一个
user
的 store,你可以定义一个 getter 来计算用户的全名:import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {state: () => ({firstName: 'John',lastName: 'Doe'}),getters: {fullName: (state) => `${state.firstName} ${state.lastName}`} })
相关文章:

vue3如何使用pinia设置全局状态,附常见面试题
1. stores/index.ts 文件 在 index.ts 中创建 store 实例并封装了注册逻辑,这样可以方便地将整个 Pinia 实例注册到 Vue 应用中。代码如下: import type { App } from vue import { createPinia } from piniaconst store createPinia()// 全局注册 st…...

lerna+umi ‘max‘ 不是内部或外部命令,也不是可运行的程序
lerna不管version7还是老版都报 $ max setup max 不是内部或外部命令,也不是可运行的程序 或批处理文件。 error Command failed with exit code 1. 这点问题是因为lerna没编译完成; 解决: 首先我们在lerna packages 里用cli 安装umi;然后…...

美格智能5G车规级通信模组: 5G+C-V2X连接汽车通信未来十年
自2019年5G牌照发放开始,经过五年发展,我国5G在基础设施建设、用户规模、创新应用等方面均取得了显著成绩,5G网络建设也即将从基础的大范围覆盖向各产业融合的全场景应用转变。工业和信息化部数据显示,5G行业应用已融入76个国民经…...

「C/C++」C/C++ 指针篇 之 指针运算
✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

计算机网络网络层笔记
互联网提供的两种服务 1.虚电路服务 2.数据报服务 需要记住的是现在只用第二种也就是数据报服务 网际协议IP 物理层的中断系统:转发器(hub) 链路层的中断系统:交换机 网络层的中断系统:路由器 网络层以上:网关 如上图所示,网关是用来访问其他的网段的一个接口,网关的地…...

长亭那个检测能力超强的 WAF,出免费版啦
告诉你们一个震撼人心的消息,那个检测能力超强的 WAF——长亭雷池,他推出免费社区版啦,体验地址见文末。 八年前我刚从学校毕业,在腾讯做安全研究,看到宇森在 BlackHat 上演讲的议题 《永别了,SQL 注入》 …...
rabbitMQ RabbitTemplate 发送消息
消息发送确认机制 消息发送确认机制:消息由producer发送后,确认其是否到达broker,又是否被exchange转发至对应queue的机制 该机制分为两部分:producer---broker,exchange---queue 前者的实现依靠ConfirmCallback机制…...
本系列是《10万字208道Java经典面试题总结(附答案)》的2024修订版。
公众号 后端学习指南 本系列是《10万字208道Java经典面试题总结(附答案)》的2024修订版。 1、说说跨平台性 我们希望编写好的代码和程序,最好可以在任意平台和环境下运行,而不需要根据不同的平台,编写不同的代码。 比如,我编写的一个博客管理系统,我希望它可以在windo…...

C语言文件基础概念的理解(一)
文件基础概念 为什么有文件? 我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存…...

C++ lambda 匿名函数
看了明仕强老师的课程,C匿名函数也可以很简单 下面请看示例代码: /* lambda表达式学习,测试主函数 */#include <iostream>using namespace std;int main() {printf("Lambda test Demo:\n");//值捕获,值捕获的时候不能修…...

基于python的简单web服务器示例
安装flask flask 简介:是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目 新建项目 创建好的效果 pip list 检索 安装…...

02- 模块化编程-006 ADC0808数码显示对比
1、ADC0808 芯片介绍 ADC0808是一款集成的CMOS设备,包含8位模拟至数字转换器、8通道多路复用器和与微处理器兼容的控制逻辑。8位A/D转换器采用逐次逼近作为转换技术。转换器特点包括高阻抗斩波稳定比较器、256R电压分压器、模拟开关树和逐次逼近寄存器。8通道多路复…...

又发现了Mac妙控鼠标的新使用方法
我一直是不爱用妙控鼠标的,因为用起来怪怪的,但是今天发现BettreAndBetter支持妙控鼠标的修改,于是就找出了闲置了许久的妙控鼠标试了一下 优化后的妙控鼠标使用起来就没有任何不适应的地方了,三指按下模拟中键,而且还…...

Webserver(4.6)poll和epoll
目录 pollclient.cpoll.c epollepoll.cclient.c epoll的两种工作模式水平触发边沿触发 poll poll是对select的一个改进 select的缺点在于每次都需要将fd集合从用户态拷贝到内核态,开销很大。每次调用select都需要在内核遍历传递进来的所有fd,这个开销也…...
LVGL 与 QT
LVGL 与 QT LVGL 适用于嵌入式、资源受限设备,尤其是在需要高效图形渲染和小型显示屏的场景下非常合适。它具有轻量级、模块化的特点,适用于内存和计算能力有限的硬件。 Qt 是一个功能强大的跨平台框架,适合开发桌面应用以及较为复杂的嵌入式…...

如何选择最适合的项目管理软件?2024年大厂首选7款工具盘点
选择最适合的项目管理软件对于提升团队效率、优化工作流程至关重要。2024年,各大厂在项目管理上逐渐趋向于使用更加智能化、集成化和协作性的工具。以下是如何选择最适合的项目管理软件,并对2024年大厂首选工具进行盘点。 选择适合的项目管理软件的关键…...

【数据结构】选择排序——选择排序 和 堆排序
选择排序 和 堆排序 一、选择排序选择排序的思路及其代码选择排序的弊端 二、堆排序三、速度对比同时排10000个数同时排100000个数同时拍500000个数堆排 1 亿个数 一、选择排序 选择排序的思路及其代码 选择排序思路很简单 就是经过将数组遍历选择最小值 将最小值位置的数与数…...

P11229 [CSP-J 2024] 小木棍
[CSP-J 2024] 小木棍 题目描述 小 S 喜欢收集小木棍。在收集了 n n n 根长度相等的小木棍之后,他闲来无事,便用它们拼起了数字。用小木棍拼每种数字的方法如下图所示。 现在小 S 希望拼出一个正整数,满足如下条件: 拼出这个数…...
【学习笔记】SAP ABAP——OPEN SQL(一)【SELECT语句】
SELECT语句简介 SELECT <lines> <columns> FROM <db> WHERE <condition>其中代表查询的件数,代表查询的字段名 SELECT SINGLE SELECT SINGLE <cols> FROM <db> WHERE <condition>该语句用于从数据库表中查询单条数据 …...
SQL注入(1)
1.数字型注入 例如PHP代码 “ Select username from users where id”.$_GET[id] 可以注意到,用户的输入ID字段没有任何过滤的,被直接拼接在了SQL查询语句中,由于ID没有被引号包裹ÿ…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...
Qt Quick Controls模块功能及架构
Qt Quick Controls是Qt Quick的一个附加模块,提供了一套用于构建完整用户界面的UI控件。在Qt 6.0中,这个模块经历了重大重构和改进。 一、主要功能和特点 1. 架构重构 完全重写了底层架构,与Qt Quick更紧密集成 移除了对Qt Widgets的依赖&…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...

vue3 手动封装城市三级联动
要做的功能 示意图是这样的,因为后端给的数据结构 不足以使用ant-design组件 的联动查询组件 所以只能自己分装 组件 当然 这个数据后端给的不一样的情况下 可能组件内对应的 逻辑方式就不一样 毕竟是 三个 数组 省份 城市 区域 我直接粘贴组件代码了 <temp…...