《Vue3 基础知识》Pinia 02 之 项目中从 Vuex 转 Pinia

Vuex 转 Pinia

前言

想了解基础知识可移步《《Vue3 基础知识》Pinia 01 之 基础》

Vue3 项目中增 Pinia,且能与 Vuex4 同时使用。

安装

npm i pinia

文件目录

  • 新建文件夹 stores,注意是复数 s。因为 Pinia每个模块都是一个 store
  • 文件 index.jsPinia 初始化文件。其它文件是带 id 的单个 store
# Pinia 目录结构,注意 ID 与文件名匹配
src
└── stores
    ├── index.js          # 初始化 Pinia
    ├── gmThemePro.js     # 'gmThemePro' id
    └── user.js           # 'user' id

初始化

src/stores/index.js 中初始化 Pinia

import { createPinia } from 'pinia'

const pinia = createPinia()

export default pinia;

src/main.js 中注册,更多单页面应用在此

import { createApp } from 'vue'
import App from './App.vue'
import pinia from './stores' // 导入 /stores/index.js

// 创建 Vue 实例
const app = createApp(App)

// 注册,注意任何 useXxxStore 都得在此代码之后使用
app.use(pinia)


改造

Vuex 写法

src\store\modules\user.js 为例,改造为 src\stores\user.js

export default {
    state: () => {
        return {
            avatar: '',
            name: '',
            isManager: false,
            userInfoRole: {}, //用户权限
            funcIds: [], // 功能菜单权限
            treeIds: [], // 目录树权限
            toolIds: [], // 工具条权限
            adminIds: [], //后台管理权限
        }
    },
    mutations: {
        SET_PRIVILEGE: (state, obj) => {
            state.funcIds = obj.funcIds
            state.treeIds = obj.treeIds
            state.toolIds = obj.toolIds
            state.adminIds = obj.privilegeExts
        },
    },
    actions: {
        // 登录
        login({ commit }, obj) {
            // TODO
        },
        // 登出
        logout({ commit }) {
            // TODO
        },
    },
}

Pinia 写法

  • 使用 defineStore 定义一个 store,且唯一 iduser
  • state 转换为一个箭头函数;
  • getter 中的第一个参数是 state ,访问 state 中的属性用第一个参数。访问其它 getter 直接用 this
  • actions 中的第一个参数 context 删除,所有东西都可用 this 访问;
  • mutationsPinia 中被弃用,可转为 action,将第一个参数 state 删除,所有东西都可用 this 访问;
import { defineStore } from 'pinia'

// 常量名建议以 `use` 开头且以 `Store` 结尾
export const useUserStore = defineStore('user', {
    state: () => {
        return {
            avatar: '',
            name: '',
            isManager: false,
            userInfoRole: {}, //用户权限
            funcIds: [], // 功能菜单权限
            treeIds: [], // 目录树权限
            toolIds: [], // 工具条权限
            adminIds: [], //后台管理权限
        }
    },
    actions: {
        // 登录
        login(obj) {
            // TODO
        },
        // 登出
        logout() {
            // TODO
        },
        // 设置用户信息,原 mutations 中的 SET_NAME
        setUserInfo( userName, isManager, userInfoRole) {
            // TODO
        },
        // 设置权限信息,原 mutations 中的 SET_PRIVILEGE
        setPrivilege(obj) {
            this.funcIds = obj.funcIds
            this.treeIds = obj.treeIds
            this.toolIds = obj.toolIds
            this.adminIds = obj.privilegeExts
        }
    }
})

使用

  • 代码第 3 行,先引入 sotre
  • 代码第 9 行,再初始化 sotre
  • 代码第 15,19 行,state/getters/actions 都可用 this.userStore 直接访问;
<script>
<!-- 第一步: 引入 --> 
import { useUserStore } from '@/stores/user'

<!-- 第二步: 定义为计算属性 -->
export default {
    computed: {
        userStore() {
            return useUserStore();
        },
    },
    methods: {
        getUserName() {
            // 直接调属性 name
            return this.userStore.name;
        },
        logout() {
            // 直接调方法 logout
            this.userStore.logout();
        }
    }
</script>

相关推荐

  1. Vue3 基础知识Pinia 02 项目 Vuex Pinia

    2024-06-15 18:40:03       32 阅读
  2. Vue3 基础知识Pinia 01 基础

    2024-06-15 18:40:03       33 阅读
  3. vue3 Pinia

    2024-06-15 18:40:03       35 阅读
  4. PiniaVue 3项目的应用

    2024-06-15 18:40:03       35 阅读
  5. vue3项目pinia的用法详解(值得收藏)

    2024-06-15 18:40:03       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-15 18:40:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-15 18:40:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-15 18:40:03       82 阅读
  4. Python语言-面向对象

    2024-06-15 18:40:03       91 阅读

热门阅读

  1. 前端面试题——React篇

    2024-06-15 18:40:03       33 阅读
  2. 【Windchill高级查询感悟笔记】

    2024-06-15 18:40:03       23 阅读
  3. 【算法与数据结构】【数组篇】【题1-题5】

    2024-06-15 18:40:03       52 阅读
  4. Ubuntu 移除netplan

    2024-06-15 18:40:03       29 阅读
  5. ubuntu设置GPU功率

    2024-06-15 18:40:03       31 阅读
  6. MatLab中无穷量和非数值量

    2024-06-15 18:40:03       34 阅读
  7. 网络安全练气篇——常见服务端口对应漏洞

    2024-06-15 18:40:03       33 阅读
  8. postman接口测试工具详解

    2024-06-15 18:40:03       34 阅读
  9. C语言运算类型有哪些

    2024-06-15 18:40:03       29 阅读