一起吹过的晚风就算相拥 — Vue Admin Work 与 Pinia的邂逅相拥---Pinia实战篇

简介: 了解过Vue Admin Work 中后台系列框架的小伙伴们都应该知道,在VueAdminWork中我状态管理我们一直是采用的 Vuex 这个经典框架 。Vuex 确实功能很强大,而且也很稳定,我在多个项目中都使用这个框架做状态管理。一次偶然的机会我接触到了 Pinia 这个新的状态管理工具,虽然它的文档现在只有英文版的,但细读下来觉得 Pinia 的设计非常之美,它,轻量,耦合性很低,宛如出水芙蓉,让人爱怜。

前言

了解过Vue Admin Work 中后台系列框架的小伙伴们都应该知道,在VueAdminWork中我状态管理我们一直是采用的 Vuex 这个经典框架 。Vuex 确实功能很强大,而且也很稳定,我在多个项目中都使用这个框架做状态管理。

一次偶然的机会我接触到了 Pinia 这个新的状态管理工具,虽然它的文档现在只有英文版的,但细读下来觉得 Pinia 的设计非常之美,它,轻量,耦合性很低,宛如出水芙蓉,让人爱怜。

所以我决定把 Vue Admin Work系列中的Vuex全部替换成Pinia

之前也有写过两篇关于Pinia的文章,算上这篇是第三篇,可以去历史文章查看。

关注我持续分享更多的干货给大家


引入

// 在命令行中执行,需要注意的是需要Vue的版本是3.2.26及以上才可以安装成功
npm i pinia

在引入成功之后,就开始创建文件,这里以VueAdminWork项目为示例。


创建相关文件

  • 创建 pinia.ts

在 src/store文件夹下创建名为: pinia.ts 的 ts 文件,内容为:

import { createPinia } from 'pinia'
export default createPinia()

然后在 src/main.ts 中引入并使用

import pinia from './store/pinia
const app = createApp(App)
app.use(pinia)

在创建并使用好 pinia 之后,我们就可以真正的开始做关于业务相关的模块了

  • 创建业务相关的模块,这里以 user 为例

在 src/store文件夹下创建名 modules 的文件夹并且创建一个名为: user.ts 的 ts 文件,内容为:

import { defineStore } from 'pinia'
import { UserState } from '../types'
import layoutStore from '../index'
import Avatar from '@/assets/img_avatar.gif'
import Cookies from 'js-cookie'
const defaultAvatar = Avatar
const useUserStore = defineStore('user', {
  state: () => {
    return {
      userId: userInfo.userId || 0,
      roleId: userInfo.roleId || 0,
      roles: userInfo.roles || [],
      token: userInfo.token || '',
      userName: userInfo.userName || '',
      nickName: userInfo.nickName || '',
      avatar: userInfo.avatar || defaultAvatar,
    }
  },
  getters: {
    userRoleCode: (state) => {
      return state.roles.map((it) => it.roleCode)
    },
  },
  actions: {
    saveUser(userInfo: UserState) {
      return new Promise<void>((res) => {
        this.userId = userInfo.userId
        this.userId = userInfo.userId
        this.token = userInfo.token
        this.roleId = userInfo.roleId
        this.roles = userInfo.roles
        this.userName = userInfo.userName
        this.nickName = userInfo.nickName
        this.avatar = userInfo.avatar || defaultAvatar
        res()
      })
    },
    changeNickName(newNickName: string) {
      this.nickName = newNickName
    },
    logout() {
      return new Promise<void>((resolve) => {
        this.userId = 0
        this.avatar = ''
        this.roleId = 0
        this.roles = []
        this.userName = ''
        this.nickName = ''
        this.token = ''
        resolve()
      })
    },
  },
})
export default useUserStore

然后在真正使用的地方去引入,比如我们在登录成功之后就保存一下用户的信息

/src/views/login.vue

// 直接在 login的 setup中引入使用,拿到userStore对象
const userStore = useUserStore()
const onLogin = () => {
  loading.value = true
  post({
    url: login,
    data: {
      username: username.value,
      password: password.value,
    },
  })
    .then(({ data }: Response) => {
       // 通过 userStore对象的 saveUser 方法,保存用户的信息
      userStore.saveUser(data as UserState).then(() => {
        router
          .replace({
            path: route.query.redirect ? (route.query.redirect as string) : '/',
          })
          .then(() => {
            loading.value = false
          })
      })
    })
    .catch((error) => {
      loading.value = false
      message.error(error.message)
    })
}

以上便是 userStore 的基础用法。如果在其它的 vue文件中使用,也是直接使用 useUserStore() 就可以


总结

总体来说 pinia 的基本使用还是比较简单的,相比于 Vuex的复杂操作,方便很多。当然还有很多细节需要大家再仔细思考,

比如:pinia 是 如何和 各个模块发生关联的,我们在使用的时候 直接 useUserStore了,没有地方和 pinia 进行关联。

带着很多问题,我们下期文章再见

相关文章
|
2月前
|
存储 JavaScript API
Vue3基础(25)___初尝pinia,相比于vuex轻量、好用
本文介绍了Pinia在Vue 3中的使用,相比于Vuex,Pinia更轻量且易于使用。文章详细解释了Pinia的基本概念、优势,并提供了安装和使用Pinia的步骤,包括定义状态、getters、actions和如何在组件中使用Pinia进行状态管理。
52 3
Vue3基础(25)___初尝pinia,相比于vuex轻量、好用
|
1月前
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战
|
1月前
|
JavaScript 前端开发
Vue开发必备:$nextTick方法的理解与实战场景
Vue开发必备:$nextTick方法的理解与实战场景
117 1
|
20天前
|
JavaScript UED
"Vue实战技巧大揭秘:一招解决路由跳转页面不回顶部难题,让你的单页面应用用户体验飙升!"
【10月更文挑战第23天】在Vue单页面应用中,点击路由跳转时,默认情况下页面不会自动滚动到顶部,这可能影响用户体验。本文通过一个新闻网站的案例,介绍了如何使用Vue-router的全局前置守卫和`scrollBehavior`方法,实现路由跳转时页面自动滚动到顶部的功能,提升用户浏览体验。
53 0
|
1月前
|
监控 JavaScript 安全
vue3添加pinia
本文介绍了Pinia作为Vue 3的状态管理库的特点,包括其基于Vue 3的Composition API、响应式状态管理、零依赖设计、插件系统、Devtools集成、Tree-shakable特性以及对TypeScript的支持,并详细说明了如何在Vue 3项目中安装和初始化Pinia。
43 0
vue3添加pinia
|
1月前
|
存储 缓存 资源调度
Vue3状态管理新选择:Pinia安装与使用详解,以及与Vuex的对比分析
Vue3状态管理新选择:Pinia安装与使用详解,以及与Vuex的对比分析
104 0
|
1月前
|
资源调度 JavaScript PHP
Vue3+ element plus 前后分离admin项目安装教程
Vue3+ element plus 前后分离admin项目安装教程
41 0
|
2月前
|
JavaScript 前端开发 UED
组件库实战 | 用vue3+ts实现全局Header和列表数据渲染ColumnList
该文章详细介绍了如何使用Vue3结合TypeScript来开发全局Header组件和列表数据渲染组件ColumnList,并提供了从设计到实现的完整步骤指导。
|
JavaScript
Vue - 实战疑点总结
1.注册全局组件(是一个单vue页面组成的一个组件,而不是现拼的template结构) 结构: 代码:main.js import UserList from './components/UserList' Vue.
2196 0
|
6天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。

相关实验场景

更多