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.rhkb.cn/news/387134.html

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

相关文章

进程间通信与线程间通信的方法汇总

目录 一、进程间通信机制 管道(pipe): 命名管道(FIFO): 消息队列(MQ): 信号量(semaphore): 共享内存(shared memory): 信号(signal): 内存映射(mapped memory): 内存映射和共享内存的区…

NFTScan 正式上线 ERC404 浏览器和 NFT API 数据服务

近日,NFTScan 团队正式对外发布了 ERC404 浏览器,将为 ERC404 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商,帮助用户更方便地访问和分析 ERC404 相关的 NFT 数据&#xff0…

git使用总结

概述 简介 Git是一种代码托管技术,很多代码托管平台也是基于Git来实现的。 Git可以帮我们做到很多的事情,比如代码的版本控制,分支管理等。 网址 git官网:https://git-scm.com/ 版本控制系统【VCS】 可以完整保存项目的快照&#…

力扣Hot100-543二叉树的直径

给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1: 输入:root [1,2,3,4,5] 输出&a…

【Vue】权限控制

权限管理 分类: 页面权限功能(按钮)权限接口权限 vue3-element-admin 的实现方案 一般我们在业务中将 路由可以分为两种,constantRoutes 和 asyncRoutes。 constantRoutes: 代表那些不需要动态判断权限的路由,如登录页、404(或…

Skywalking 入门与实战

一 什么是 Skywalking? Skywalking 时一个开源的分布式追踪系统,用于检测、诊断和优化分布式系统的功能。它可以帮助开发者和运维人员深入了解分布式系统中各个组件之间的调用关系、性能瓶颈以及异常情况,从而提供系统级的性能优化和故障排查。 1.1 为…

嵌入式初学-C语言-八

#接嵌入式初学-C语言-七# 分支结构 分支结构&#xff1a;又被称之为选择结构 选择结构的形式 多分支 语法&#xff1a; if(条件1) { 语句1; } else if(条件2) { 语句2; } ... else { 语句n1; }案例&#xff1a; #include <stdio.h> int main() { // 需求&#xff…

Apache、nginx

一、Web 1、概述 Web&#xff1a;为⽤户提供的⼀种在互联⽹上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联⽹服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊天、购物…

线程的同步互斥

互斥 互斥保证了在一个时间内只有一个线程访问一个资源。 先看一段代码&#xff1a;三个线程同时对全局变量val进行--&#xff0c;同时val每自减一次其线程局部存储的全局变量 #include <iostream> #include <thread> #include <vector> #include <uni…

Stable Diffusion WebUI本地环境搭建

一、项目代码下载 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、环境配置 conda create --n stafu python3.10.6 实际上跟自己创建的环境没有关系&#xff0c;项目启动会自动复制这个环境&#xff0c;之后项目根据这个基础环境构建 也可以在自己…

C++高性能通信:图形简述高性能中间件Iceoryx

文章目录 1. 概述2. 支持一个发布者多个订阅者2.2 Iceoryx为何不支持多个发布者发布到同一个主题 3. Iceoryx的架构和数据传输示意图3.1 发布者与订阅者的通信机制3.2 零拷贝共享内存通信机制 4. 使用事件驱动机制4.1 WaitSet机制4.2 Listener机制 5. 已知限制6. 参考 1. 概述 …

ImportError: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20‘ 报错解决办法

1.查找 libstdc.so.6* find / -name libstdc.so.6*2.copy一个libstdc.so.6.0.19到/usr/lib64/下 cp /usr/lib64/libstdc.so.6 /usr/lib64/3.创建软连接 ln -sf /usr/lib64/libstdc.so.6.0.31 /usr/lib64/libstdc.so.6完毕&#xff01;

中电金信:云原生时代IT基础设施管理利器——基础设施即代码(IaC)

在数字化转型、零售业务快速发展、信创建设驱动下&#xff0c;应用架构、技术架构、基础架构都已向云原生快速演进&#xff0c;银行业IT基础设施管理产生了非常大的变化&#xff0c;当前银行业&#xff0c;正在开展新一轮的核心应用系统重构、基础平台统一建设等重点任务&#…

Linux网络:传输层协议TCP(二)三次挥手四次握手详解

目录 一、TCP的连接管理机制 1.1三次握手 1.2四次挥手 二、理解 TIME_WAIT 状态 2.1解决TIME_WAIT 状态引起的 bind 失败的方法 三、理解CLOSE_WAIT状态 一、TCP的连接管理机制 在正常情况下, TCP 要经过三次握手建立连接, 四次挥手断开连接 1.1三次握手 三次握手顾名思…

【设计模式】代理模式详解

1.简介 代理模式是常用的Java设计模式&#xff0c;该模式的特点是代理类与委托类共享相同的接口。代理类主要负责预处理消息、过滤消息、将消息转发给委托类&#xff0c;并在事后处理消息等。代理类与委托类之间通常存在关联关系&#xff0c;一个代理类对象与一个委托类对象关…

SpringBoot Mysql->达梦8 activiti6.0.0 项目迁移

全部源码&#xff1a;公众号搜索资小库&#xff0c;回复dm获取源码 1.整合达梦 1.1 达梦驱动下载 MyBatis-Plus 框架 | 达梦技术文档 (dameng.com) 1.2 数据迁移 怎么安装数据库&#xff0c;很多大佬有帖子&#xff0c;搜一下达梦先建立用户&#xff0c;使用DM管理工具 链…

SQL Server 数据误删的恢复

在日常的数据库管理中&#xff0c;数据的误删操作是难以避免的。为了确保数据的安全性和完整性&#xff0c;我们必须采取一些措施来进行数据的备份和恢复。本文将详细介绍如何在 SQL Server 中进行数据的备份和恢复操作&#xff0c;特别是在发生数据误删的情况下。假设我们已经…

使用visual studio编译C++项目时无法找到 enum中的某些项

vs 2017 编译一个cocos2dx 的老项目时&#xff0c;报错&#xff1a; 在项目中搜索关键字 ARMATURE_LOOP_COMPLETE&#xff0c;发现在文件EventType.h中是有定义的&#xff0c;是 enum Event 的一项&#xff0c;而且确认了报错的文件已经引入了这个头文件&#xff1a; 这太奇怪了…

傻瓜式PHP-Webshell免杀学习手册,零基础小白也能看懂

项目描述 一、PHP相关资料 PHP官方手册&#xff1a; https://www.php.net/manual/zh/ PHP函数参考&#xff1a; https://www.php.net/manual/zh/funcref.php 菜鸟教程&#xff1a; https://www.runoob.com/php/php-tutorial.html w3school&#xff1a; https://www.w3school…

【React】全面解析:从基础知识到高级应用,掌握现代Web开发利器

文章目录 一、React 的基础知识1. 什么是 React&#xff1f;2. React 的基本概念3. 基本示例 二、React 的进阶概念1. 状态&#xff08;State&#xff09;和属性&#xff08;Props&#xff09;2. 生命周期方法&#xff08;Lifecycle Methods&#xff09;3. 钩子&#xff08;Hoo…