vue3 pinia 状态管理(清晰明了)
创始人
2024-05-13 06:33:28
0

前言

最近学习cloud项目,前端使用到 vue3 + ts 等技术,其中包括 pinia ,从一脸懵到渐渐清晰过程,在此记录一下,若有不足,希望大佬可以指出。
中文官方文档:https://pinia.web3doc.top/
在这里插入图片描述

一、什么是 Pinia

Pinia 是 Vue 的存储库,它允许跨组件/页面共享状态。实际上,pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia,而没有取名Vuex,所以大家可以直接将pinia比作为Vue3的Vuex。

二、Pinia 和 Vuex 优缺点

Vuex 的优点:

  • 支持调试功能,如时间旅行和编辑
  • 适用于大型、高复杂度的Vue.js项目

Vuex 的缺点:

  • 从 Vue 3 开始,getter 的结果不会像计算属性那样缓存
  • Vuex 4有一些与类型安全相关的问题

pinia 的优点:

  • 完整的 TypeScript 支持: 与在 Vuex 中添加 TypeScript 相比,添加 TypeScript 更容易
  • 极其轻巧 (体积约 1KB)
  • store 的 action 被调度为常规的函数调用,而不是使用 dispatch 方法或 MapAction辅助函数这在 Vuex 中很常见
  • 支持多个store
  • 支持 Vue devtools、SSR 和 webpack 代码拆分
    pinia 的缺点:
  • 不支持时间旅行和编辑等调试功能

三、何时使用Pinia,何时使用Vuex

  • 由于 pinea 是轻量级的,体积很小,它适合于中小型应用。它也适用于低复杂度的Vue.js项目,因为一些调试功能,如时间旅行和编辑仍然不被支持
  • 将 Vuex 用于中小型 Vue.is 项目是过度的,因为它重量级的,对性能降低有很大影响。因此,Vuex 适用于大规模、高复杂度的 Vue.js 项目

四、安装

CMD命令:

npm install pinia

main.ts:

import { createPinia } from 'pinia'app.use(createPinia())

五、核心概念

pinia 常用模版

import { defineStore } from 'pinia'export const userStore = defineStore('userStore', {state: () => ({// 内容}),actions: {// 内容}
})

定义 State

在深入了解核心概念之前,我们需要知道 Store 是使用 defineStore() 定义的,并且它需要一个唯一名称,作为第一个参数传递

import { defineStore } from 'pinia'// useStore 可以是 useUser、useCart 之类的任何东西
// 第一个参数是应用程序中 store 的唯一 id (userStore)
export const useStore = defineStore('userStore', {// other options...
})

State

大多数时候,state 是 store 的核心部分。 我们通常从定义应用程序的状态开始。 在 Pinia 中,状态被定义为返回初始状态的函数(类似 data)。 Pinia 在服务器端和客户端都可以工作。

案例

import { defineStore } from 'pinia'// 唯一 ID: testStore
export const testStore = defineStore('testStore', {state: () => ({// 用户信息user: {id: '1',username: 'lanys',password: '123456'}})
})

实现效果

在这里插入图片描述

改变 store 中的值

可以调用 $patch 方法。 它允许您使用部分“state”对象同时应用多个更改:

  store.$patch({user: {id: '2',username: '张三',password: '456789'}})

改变值效果

在这里插入图片描述

Actions

Actions 相当于组件中的 methods。 它们可以使用 defineStore() 中的 actions 属性定义,并且它们非常适合定义业务逻辑:

import { defineStore } from 'pinia'export const testStore = defineStore('testStore', {state: () => ({// 用户信息user: {username: '',password: ''}}),actions: {// 设置 usersetUser(val: any) {this.user = val}}
})

实现效果

在这里插入图片描述
在这里插入图片描述

六、项目案例(用户登录存储token)

下面是项目中所使用的 Piain 案例,在此解析一下。

main.ts

  1. 注册 Pinia
  2. 注册 Pinia 插件(全局对象)
import { createPinia } from 'pinia'
import { registerStore } from './store'app.use(createPinia())
// 注册 Pinia 插件(全局对象)
registerStore()

index.ts(全局对象插件)

作用:将 Store 作为静态属性,全局对象

import { userStore } from './modules/user'const store: any = {}export const registerStore = () => {store.userStore = userStore()
}export default store

在这里插入图片描述

使用

store.userStore.accountLoginAction(loginForm) 是可以直接使用的


userStore

import { defineStore } from 'pinia'
// 登录的 api 接口文件
import { useAccountLoginApi, useMobileLoginApi, useLogoutApi } from '@/api/auth'
// api 接口文件
import { useUserInfoApi } from '@/api/sys/user'
// 缓存文件
import cache from '@/utils/cache'export const userStore = defineStore('userStore', {state: () => ({// 用户信息user: {id: '',username: '',avatar: ''}}),actions: {// 设置tokensetToken(val: any) {this.token = val// 使用到 cache 文件cache.setToken(val)},// 异步账号登录async accountLoginAction(loginForm: any) {// 登录请求,获取返回 dataconst { data } = await useAccountLoginApi(loginForm)// 设置tokenthis.setToken(data.access_token)}}
})

cache缓存文件

从上面缓存 token cache.setToken(val)

import { SessionStorage, Storage } from '@/utils/storage'
// 设置缓存的key文件
import CacheKey from '@/utils/cache/key'// 缓存
class Cache {// 获取 tokengetToken = (): string => {return Storage.getItem(CacheKey.TokenKey) || ''}// 设置 tokensetToken = (value: string) => {Storage.setItem(CacheKey.TokenKey, value)}
}export default new Cache()

storage 工具

/*** window.localStorage 浏览器永久缓存* @method setItem 设置缓存* @method getItem 获取缓存* @method removeItem 移除缓存* @method clear 移除全部缓存*/
export const Storage = {setItem(key: string, value: any) {if (value === undefined) {return}window.localStorage.setItem(key, JSON.stringify(value))},getItem(key: string) {let json: any = window.localStorage.getItem(key)return JSON.parse(json)},removeItem(key: string) {window.localStorage.removeItem(key)},clear() {window.localStorage.clear()}
}/*** window.sessionStorage 浏览器临时缓存* @method setItem 设置缓存* @method getItem 获取缓存* @method removeItem 移除缓存* @method clear 移除全部缓存*/
export const SessionStorage = {setItem(key: string, value: any) {if (value === undefined) {return}window.sessionStorage.setItem(key, JSON.stringify(value))},getItem(key: string) {let json: any = window.sessionStorage.getItem(key)return JSON.parse(json)},removeItem(key: string) {window.sessionStorage.removeItem(key)},clear() {window.sessionStorage.clear()}
}

在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...