【Pinia】Vuex升级到Pinia(适用于轻度使用Vuex)

679 阅读2分钟

因为Pinia使用起来真的很方便,所以将自己的项目升级为Pinia,体验一下。

本方法是一个比较原始的方法,将使用Vuex的地方,改成Pinia使用形式,所以适用于项目中轻度使用vuex, 如果项目中大量使用Vuex不建议使用该方法,会有机械式重复操作。

1. 卸载

npm uninstall vuex
npm cache clean --force

2. 安装pinia

npm install pinia

3. main.ts引入

将原来Vuex的注册使用删除,并引入Pinia.

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

4. 修改store文件夹下文件

举个栗子: 不再需要index.js主文件来整体导出。

修改前:

import { loginApi } from "@/api/user/user";
import { LoginParm, LoginResult } from "@/api/user/UserModel"; import { Result } from "@/http/request";
import { ActionContext } from "vuex";
import { RootState } from "../index";
import { setToken,setUserId,setExpireTime } from '@/utils/auth'; //定义state类型
export type UserState = {
    token:string,
    userId:string
}
//定义state
export const state : UserState = {
  token:'',
  userId:'' }
  //定义mutations
  export const mutations = {
      setToken(state:UserState,token:string){
          state.token = token;
      },
      setUserId(state:UserState,userId:string){
          state.userId = userId;
      }
  }
  //定义actios
export const actions = {
  login({commit}:ActionContext<UserState,RootState>,loginParm:LoginParm){
      return new Promise<Result>((resolve,reject)=>{
          loginApi(loginParm).then(res=>{
              if(res.data.code == 200){
//设置到vuex中 commit('setToken',res.data.token) commit('setUserId',res.data.id) //存储到sessionStorage setToken(res.data.token) setUserId(res.data.id) setExpireTime(res.data.expireTime)
}
              resolve(res)
          }).catch(error=>{
              reject(error)
}) })
  }
}

//定义getters
export const getters = {
  getToken(state:UserState){
      return state.token
} }
export default{
  namespaced:true,
  state,
  mutations,
  actions,
  getters
}

修改后:

import { defineStore } from "pinia"
import { loginApi } from "@/api/user/user"
import { LoginParm, LoginResult } from "@/api/user/UserModel"
import { Result } from "@/http/request"

export type UserState = {
  token: string
  userId: string
}
export const useUserStore = defineStore("userStore", {
  state: (): UserState => {
    return {
      token: "",
      userId: "",
    }
  },
  actions: {
    setToken(token: string) {
      this.token = token
    },
    setUserId(userId: string) {
      this.userId = userId
    },
    login(loginParm: LoginParm) {
      return new Promise<Result>((resolve, reject) => {
        loginApi(loginParm)
          .then((res) => {
            if (res.data.code == 200) {
              //设置到vuex中 commit('setToken',res.data.token) commit('setUserId',res.data.id)
              //存储到sessionStorage setToken(res.data.token) setUserId(res.data.id) setExpireTime(res.data.expireTime)
            }
            resolve(res)
          })
          .catch((error) => {
            reject(error)
          })
      })
    },
  },
  getters: {
    getToken(state: UserState) {
      return state.token
    },
  },
})

5. 修改使用store中数据的地方

举个栗子: 这个栗子是修改使用getters里的数据,其他actions也是同理,在使用位置只需要点一下,就能提示出来这个store里的所有数据和方法,用起来很方便。 修改前:

<script lang="ts" setup>
import { computed } from "vue"
import { useStore } from "@/store/index"

const store = useStore()
const isCollapse = computed(() => {
  return store.getters["menu/getCollapse"]
})
</script>

修改后:

<script lang="ts" setup>
import { computed } from "vue"
import { useMenuStore } from "@/store/menu"

const menuStore = useMenuStore()
const isCollapse = computed(() => {
  return menuStore.getCollapse
})
</script>