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

2022-10-28 18:38:35 浏览数 (1)

前言

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

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

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

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

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

引入

代码语言:javascript复制
// 在命令行中执行,需要注意的是需要Vue的版本是3.2.26及以上才可以安装成功
npm i pinia

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

创建相关文件

  • 创建 pinia.ts

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

代码语言:javascript复制
import { createPinia } from 'pinia'
export default createPinia()

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

代码语言:javascript复制
import pinia from './store/pinia
const app = createApp(App)
app.use(pinia)

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

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

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

代码语言:javascript复制
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

代码语言:javascript复制
// 直接在 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 进行关联。

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

0 人点赞