目录
- 1. 基本知识
- 2. Demo1
- 3. Demo2
1. 基本知识
优势和用途
- 简化代码:用 mapGetters 和 mapState,可以简化组件中对于 Vuex 中状态和 getter 的映射工作,减少了重复的代码书写
- 更易读:组件中直接使用映射的计算属性,使得代码更加清晰易懂,组件的状态管理部分与视图逻辑分离
- 组件复用:计算属性的定义是在组件中,因此可以轻松地将组件复用到不同的场景中,而不必担心状态和 getter 的映射工作
mapGetters 是 Vuex 提供的辅助函数,用于将 store 中的 getters 映射到组件的计算属性中。它接收一个数组或对象作为参数,返回一个对象,对象的键是映射到组件中的计算属性名,值是相应的 getter 函数名或者对象
数组:
import { mapGetters } from 'vuex'export default {computed: {...mapGetters(['getterName1','getterName2'])}
}
对象:
import { mapGetters } from 'vuex'export default {computed: {...mapGetters({aliasName1: 'getterName1',aliasName2: 'getterName2'})}
}
mapState 也是 Vuex 提供的辅助函数,同理
import { mapState } from 'vuex'export default {computed: {...mapState(['stateName1','stateName2'])}
}
以及
import { mapState } from 'vuex'export default {computed: {...mapState({aliasName1: state => state.moduleName.stateName1,aliasName2: 'stateName2'})}
}
2. Demo1
整体的基本知识可能过于抽象
通过实战的整体逻辑,可能会有感触
mapState 和 mapGetters 是 Vuex 提供的辅助函数,用于在 Vue 组件中映射 Vuex 中的状态和 getter 到组件的计算属性中
-
在 Vuex 中定义了一些状态(state)、getter 和 mutations,这些定义分别放在了 common.js、getters.js 和 logs.js 等文件中
-
在 index.js 中创建了 Vuex 的 Store,将这些模块注册到了 Store 中,并导出了这个 Store
-
有一个 Vue 组件,需要用到 common 模块中的状态和 getters.js 中的 getter
第三步骤的代码如下:
在index中引入,创建了 Vuex 的 Store
import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
import common from './modules/common'
import tags from './modules/tags'
import logs from './modules/logs'
import dict from './modules/dict'
import getters from './getters'Vue.use(Vuex)
const store = new Vuex.Store({modules: {user,common,logs,tags,dict},getters,
})export default store
截图如下:
在getters文件中引入需要导出的变量
const getters = {logsList: state => state.logs.logsList,logsLen: state => state.logs.logsList.length || 0,
}
export default getters
对应的logs.js文件引入相关内容:
import {setStore, getStore} from '@/util/store'
import {dateFormat} from '@/util/date'
import {sendLogs} from '@/api/user'const logs = {state: {logsList: getStore({name: 'logsList'}) || [],},actions: {SendLogs({state, commit}) {return new Promise((resolve, reject) => {sendLogs(state.logsList).then(() => {commit('CLEAR_LOGS');resolve();}).catch(error => {reject(error)})})},},mutations: {ADD_LOGS: (state, {type, message, stack, info}) => {state.logsList.push(Object.assign({url: window.location.href,time: dateFormat(new Date())}, {type,message,stack,info: info.toString()}))setStore({name: 'logsList', content: state.logsList})},CLEAR_LOGS: (state) => {state.logsList = [];setStore({name: 'logsList', content: state.logsList})}}};export default logs;
如果后续需要使用到
具体如下:
computed: {...mapGetters(['logsList']),使用方法fun() {this.logsList
}
3. Demo2
对于上述的逻辑比较清晰了,再给出另外一个Demo
getters文件
const getters = {userInfo: state => state.user.userInfo,
}
export default getters
对应user.js文件中含有丰富的方法:
如果后续需要使用,具体Demo如下(假设template中有使用到userInfo的信息):
<template slot="menuLeft"><el-button size="small"icon="el-icon-setting"@click="handleRole"v-if="userInfo.role_name.includes('admin')"plain>权限设置</el-button>
</template>
具体js如下:
computed: {...mapGetters(["userInfo", "permission"]),permissionList() {return {addBtn: this.vaildData(this.permission.role_add, false),viewBtn: this.vaildData(this.permission.role_view, false),delBtn: this.vaildData(this.permission.role_delete, false),editBtn: this.vaildData(this.permission.role_edit, false)};}
},