Vue 3 状态管理 Pinia 详解

引言

随着 Vue 3 的推出,Pinia 成为了 Vue 社区中一个备受瞩目的状态管理库。它简洁而强大,旨在替代 Vuex,为开发者提供更加灵活的状态管理解决方案。本文将详细介绍 Pinia 的核心概念、安装方法、使用技巧以及如何在 Vue 3 项目中集成 Pinia。

1. Pinia 简介

Pinia 是一个轻量级的状态管理库,专为 Vue 3 设计。它的设计理念是简单、直观,易于学习和使用。Pinia 支持组合式 API 和选项式 API,使得状态管理更加灵活。

2. 安装 Pinia

安装 Pinia 非常简单,可以通过 npm 或 yarn 完成。

Bash

1npm install pinia --save
2# 或者
3yarn add pinia
3. 创建 Store

在 Pinia 中,状态管理的核心是 Store。Store 可以理解为一个包含状态、getters 和 actions 的对象。

Javascript

1// stores/user.js
2import { defineStore } from 'pinia'
3
4export const useUserStore = defineStore('user', {
5  state: () => {
6    return {
7      isLoggedIn: false,
8      user: null
9    }
10  },
11  actions: {
12    login(user) {
13      this.isLoggedIn = true
14      this.user = user
15    },
16    logout() {
17      this.isLoggedIn = false
18      this.user = null
19    }
20  },
21  getters: {
22    isUserLoggedIn: (state) => state.isLoggedIn,
23    currentUser: (state) => state.user
24  }
25})
4. 注册 Store

在主应用文件中注册 Pinia 和 Store。

Javascript

1// main.js
2import { createApp } from 'vue'
3import { createPinia } from 'pinia'
4import App from './App.vue'
5import { useUserStore } from './stores/user'
6
7const app = createApp(App)
8
9// 注册 Pinia
10app.use(createPinia())
11
12// 注册 Store
13app.provide('user', useUserStore())
14
15app.mount('#app')
5. 使用 Store

在组件中使用 Store 非常简单,只需要通过 useStore 函数获取 Store 实例即可。

Javascript

1// components/Login.vue
2import { defineComponent } from 'vue'
3import { useUserStore } from '@/stores/user'
4
5export default defineComponent({
6  setup() {
7    const userStore = useUserStore()
8
9    const handleLogin = (user) => {
10      userStore.login(user)
11    }
12
13    return {
14      userStore,
15      handleLogin
16    }
17  }
18})
6. 多个 Store

Pinia 支持创建多个 Store,每个 Store 都有自己的命名空间,这样可以更好地组织状态。

Javascript

1// stores/counter.js
2import { defineStore } from 'pinia'
3
4export const useCounterStore = defineStore('counter', {
5  state: () => ({ count: 0 }),
6  actions: {
7    increment() {
8      this.count++
9    }
10  }
11})
7. 嵌套 Store

Pinia 还支持嵌套 Store,这样可以更细粒度地管理状态。

Javascript

1// stores/nested.js
2import { defineStore } from 'pinia'
3
4export const useNestedStore = defineStore('nested', {
5  state: () => ({
6    subStore: {
7      count: 0
8    }
9  }),
10  actions: {
11    increment() {
12      this.subStore.count++
13    }
14  }
15})
8. Store 导航守卫

在 Vue Router 中,可以使用 Store 来控制导航。

Javascript

1// router/index.js
2import { createRouter, createWebHistory } from 'vue-router'
3import { useUserStore } from '@/stores/user'
4
5const router = createRouter({
6  history: createWebHistory(),
7  routes: [
8    {
9      path: '/',
10      name: 'home',
11      component: Home
12    },
13    {
14      path: '/dashboard',
15      name: 'dashboard',
16      component: Dashboard,
17      beforeEnter: (to, from, next) => {
18        const userStore = useUserStore()
19        if (userStore.isLoggedIn) {
20          next()
21        } else {
22          next('/login')
23        }
24      }
25    }
26  ]
27})
28
29export default router
9. 存储持久化

有时候我们需要将 Store 中的数据持久化到本地存储中,Pinia 提供了插件机制来实现这一需求。

Javascript

1// plugins/persist.js
2import { createPersistedState } from "pinia-plugin-persistedstate";
3
4export default function setupPinia(app) {
5  const pinia = createPinia();
6
7  // 使用 pinia-plugin-persistedstate 插件
8  pinia.use(createPersistedState());
9
10  app.use(pinia);
11}
10. 测试 Store

Pinia 提供了测试工具,方便进行单元测试。

Javascript

1// tests/unit/stores/user.spec.js
2import { shallowMount, createTestingPinia } from '@vue/test-utils'
3import { useUserStore } from '@/stores/user'
4
5describe('User Store', () => {
6  it('should log in and out correctly', async () => {
7    const wrapper = shallowMount(App, {
8      global: {
9        plugins: [createTestingPinia()],
10      },
11    })
12
13    const userStore = useUserStore()
14
15    expect(userStore.isLoggedIn).toBe(false)
16
17    await userStore.login({ name: 'John Doe' })
18
19    expect(userStore.isLoggedIn).toBe(true)
20    expect(userStore.user.name).toBe('John Doe')
21
22    await userStore.logout()
23
24    expect(userStore.isLoggedIn).toBe(false)
25  })
26})
结语

Pinia 为 Vue 3 提供了一个简单而强大的状态管理解决方案。通过本文的介绍,你应该已经了解了如何在 Vue 3 项目中使用 Pinia 进行状态管理。Pinia 的灵活性和易用性使其成为许多开发者首选的状态管理库。

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

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

相关文章

学习ruixingkafei过程

一、抓包 手机安装证书,开启VPN抓包,电脑上打开花瓶,在同一个局域网内抓包,这些老一套没什么可说的。 看看我们的抓包结果是不是很美丽,请求内容加密,返回内容也加密,猜测加密方式aes&#xff0…

JWT (JSON Web Token)

🎼个人主页:金灰 😎作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 🍊易编橙终身成长社群&#…

AI绘画3分钟解决英文恐惧症,comfyui汉化插件

前言 全面解析:Comfy UI汉化插件的安装与配置指南 本文涉及的工作流和插件,需要的朋友请扫描免费获取哦 引言 本文图片来源网络,侵权联删除。 在全球化的今天,软件界面的本地化是提升用户体验的重要一环。对于许多非英语母语的…

Java面试题基础

基础总结 Java Java 平台无关性 主要通过三个方面实现. Java 语言规范: 通过规定 Java 语言中基本数据类型的取值范围和行为,比如 int 长度为 4 字节,这是固定的。Class 文件: 所有 Java 文件要通过 javac 或者其他一些 java 编…

EasyExcel入门

目录 一、文章简介 二、概念 1.EasyExcel是什么? 2.EasyExcel 能用在哪里? 3.为什么要选用EasyExcel解析excel? 4.如何使用EasyExcel? 三、EasyExcel快速入门 1.环境搭建 2.简单写excel 代码示例 TestFileUtil Employe…

iPhone最全隐藏功能

让你的iphone没有白买!一定要学会以下三十个iphone技巧: 一、正品苹果手机输入“苹果”会出现图标,山寨或其他机型只能打出红色的 二、长按图片中的人像不松,可以自动抠图。 三、Siri换男生,设置-Siri与搜索- Siri声音…

关于ollama+open webui无法局域网访问的解决办法

ollama api本地默认地址:http://127.0.0.1:11434 open webui的默认地址:http://127.0.0.1:3000 如果是本机访问,ollama默认允许本机跨域访问(哈里是看ollama的日志都是OPTIONS请求,bing后发现的)&#xf…

TensorFlow 可用的人脸识别的模型有哪些,各有什么优缺点

在使用TensorFlow进行人脸识别时,有多种可用的模型,每种模型在性能和应用场景方面各有不同。以下是一些常用的人脸识别模型及其优缺点: 1. FaceNet 优点: 高准确性:FaceNet通过计算脸部特征向量并进行向量比较,具有较高的识别准确性。通用性强:生成128维特征向量,可以…

Mysql:删除库下面所有表

Mysql删除库下面所有表 方法一 1、删除数据库: DROP DATABASE your_database_name;2、重新创建数据库: CREATE DATABASE your_database_name;方法二 1、生成删除表语句 SET FOREIGN_KEY_CHECKS 0;SELECT Concat(DROP TABLE IF EXISTS , table_nam…

Linux的NTP配置

一、监控时间: watch date 二、NTP配置 1、查看时间 ntpdate -q 192.168.192.3 ntpdate 192.168.192.3 2、配置时间服务器 vi /etc/ntp.conf server 192.168.192.3 iburst 3、设置时间不允许回调 vi /etc/sysconfig/ntpd OPTIONS"-u ntp:ntp -p /va…

什么时候使用auto

合理使用auto&#xff0c;可以让程序员从复杂的类型编码中解放出来&#xff0c;合理使用auto&#xff0c;可以让程序员从复杂的类型编码中解放出来。 那么什么时候使用auto呢&#xff1f; 1&#xff0e;当一眼就能看出声明变量的初始化类型的时候可以使用auto。 std::map<…

心灵调整:音乐之美

音乐每天都在不同的空间和复杂的形式影响着人们。从电梯音乐削减尴尬的沉默,到家庭交通堵塞。音乐增强了人们所爱的人与人之间的瞬间,并帮助他们度过艰难时期。音乐被用于世界各地几代人的各种形式的治疗。本文进一步阐述了它如何在几种类型的心理健康状况中得到应用。 什么是音…

【SOC 芯片设计 DFT 学习专栏 -- DFT DRC规则检查】

请阅读【嵌入式及芯片开发学必备专栏】 请阅读【芯片设计 DFT 学习系列 】 如有侵权&#xff0c;请联系删除 转自&#xff1a; 芯爵ChipLord 2024年07月10日 12:00 浙江 文章目录 概述DRC的概念Tessent DRC检查的概述时钟相关检查扫描相关检查BIST规则检查预DFT时钟规则检查 …

typescript 其他数据类型说明

/* any、unknown、never类型的区别相同&#xff1a;都是可以赋值任何类型 不同&#xff1a;any可以再赋任何值。unknown二次赋值只能再给any&#xff5c;unknown&#xff0c;不能时其他类型。never绝不能赋值&#xff0c;包括初始化赋值。*/let value1: any "123";…

SQL优化(一)基础概念

基数&#xff08;cardinality&#xff09; 表中某个列的唯一键的数量叫做基数&#xff0c;主键列的基数就是表中数据的总行数。 可以用select count(distinct 列名) from 表名来计算基数。 基数的高低影像列的数据分布。 例如&#xff1a;先用Scott账户创建一个测试表test …

设计模式15-门面模式

设计模式15-门面模式 "接口隔离"模式典型模式1. 适配器模式&#xff08;Adapter Pattern&#xff09;2. 装饰模式&#xff08;Decorator Pattern&#xff09;3. 桥接模式&#xff08;Bridge Pattern&#xff09;4. 代理模式&#xff08;Proxy Pattern&#xff09;5. …

Git基本原理介绍及常用指令

文章目录 前言一、Git是什么&#xff1f;集中化的版本控制系统分布式版本控制系统 二、Git基本概念三、git命令操作配置用户信息常用指令 总结 前言 如果你用Microsoft Word写过论文&#xff0c;那你一定有这样的经历&#xff1a;想删除一个段落&#xff0c;又怕将来想恢复找不…

kafka cmd

list topic ./bin/kafka-topics.sh --list --zookeeper 127.0.0.1:2181指定 conf 如果是 ssl 协议指定 指定配置文件 /opt/kafka/bin/kafka-consumer-groups.sh --command-config /opt/kafka/bin/kafka-console-consumer.sh --consumer.config/opt/kafka/bin/kafka-console…

linux:用户管理,增删改

1.查看当前登录的用户信息 [root@bgx ~]# id #查看当前所登陆的用户信息 # uid:用户id,系统只能识别uid,不能识别名字,人看名字 # gid:组id uid=0(root) gid=0(root) groups=0(root) [root@bgx ~]# id oldboy #查看其它用户的信息 uid=1000(oldboy) gid=1000(oldboy) g…

【Linux】2.Linux 指令大揭秘:常见八个指令的妙用(上)

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;Linux 指令大揭秘&#xff1a;常见八个指令的妙用&#xff08;上&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | …