一、vuex持久化
1、使用插件vuex-persistedstate Vuex数据持久化存储。
2、不使用插件方式:存储在localStorage或者sessionStorage,state定义变量,mutations同步更新变量,并且存储一份在localStorage或者sessionStorage中,actions异步请求,触发mutations同步更新,getters(store的计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算)对state进行计算并缓存。
// import { findMenuTree, findMenuList } from "../../json/list"; // 测试环境,暂时使用
// import { findMenuList } from "../../json/list"; // 测试环境,暂时使用
import { findMenuTreeSideBar, findMenuList } from '@/http/moudules/menu'
import { getPermissionList } from '@/http/moudules/login'
export default {
state: {
menuTree: null, // 菜单树
menuList: null,
firstPath: null,
menuRouteLoaded: null // 菜单和路由是否已经加载
},
getters: {
menuTree: (state) => {
if (state.menuTree === null || state.menuTree.length === 0) {
state.menuTree = JSON.parse(sessionStorage.getItem('menuTree')) || []
}
return state.menuTree
},
menuList: (state) => {
if (state.menuList === null || state.menuList.length === 0) {
state.menuList = JSON.parse(sessionStorage.getItem('menuList')) || []
}
return state.menuList
},
firstPath: (state) => {
if (state.firstPath === null) {
state.firstPath = sessionStorage.getItem('firstPath') || '/'
}
return state.firstPath
},
menuRouteLoaded: (state) => {
if (state.menuRouteLoaded === null) {
state.menuRouteLoaded = sessionStorage.getItem('menuRouteLoaded') || false
}
return state.menuRouteLoaded
}
},
mutations: {
setMenuTree(state, menuTree) {
// 设置导航菜单树
sessionStorage.setItem('menuTree', JSON.stringify(menuTree))
state.menuTree = menuTree
},
setMenuList(state, menuList) {
// 设置菜单列表
sessionStorage.setItem('menuList', JSON.stringify(menuList))
state.menuList = menuList
},
setFirstPath(state, firstPath) {
sessionStorage.setItem('firstPath', firstPath)
state.firstPath = firstPath
},
setMenuRouteLoaded(state, menuRouteLoaded) {
// 改变菜单和路由的加载状态
sessionStorage.setItem('menuRouteLoaded', menuRouteLoaded)
state.menuRouteLoaded = menuRouteLoaded
}
},
actions: {
getMenuTree({ commit }) {
let userInfo = JSON.parse(localStorage.getItem('user_info'))
let data = {
userId: userInfo.userId,
tenantId: userInfo.tenantId,
appId: userInfo.tenantAppId
}
return new Promise((resolve) => {
findMenuTreeSideBar(data).then((response) => {
resolve(response.data)
})
// resolve(findMenuTree().data.data); // 测试环境,暂时使用
}).then((data) => {
return new Promise((resolve) => {
// 保存加载状态
commit('setMenuRouteLoaded', true)
// 保存菜单树
// data.unshift({
// id: '-1',
// menuIcon: 'el-icon-s-comment',
// menuName: '首页',
// url: '/welcome',
// children: [],
// component: '/welcome',
// type: {
// value: 0,
// desc: '目录'
// },
// parent: {}
// })
commit('setMenuTree', data)
resolve(data)
})
})
},
getPerList({ commit }) {
let userInfo = JSON.parse(localStorage.getItem('user_info'))
let data = {
userId: userInfo.userId,
tenantId: userInfo.tenantId,
appId: userInfo.tenantAppId
}
return new Promise((resolve) => {
findMenuList(data).then((response) => {
resolve(response.data)
})
getPermissionList().then((res) => {
commit('setPerms', res.data.value)
})
// resolve(findMenuList().data.data) // 测试环境,暂时使用
}).then((data) => {
return new Promise((resolve) => {
let temp = data
.filter((n) => {
return n.type.value === 0 || n.type.value === 1
})
.map((m) => m.url.toLowerCase())
// 保存菜单权限列表
commit('setMenuList', temp)
resolve(temp)
})
})
},
resetPermissionLoad({ commit }) {
commit('setMenuRouteLoaded', false)
}
}
}
页面访问:
import { mapGetters } from 'vuex'
computed: {
...mapGetters(['menuTree']),
},
通过this.menuTree访问
或者this.$store.getters['menuTree']
二、vuex模块化 vuex使用详解-Module模块
默认情况下,模块内部的 action 和 mutation 仍然是注册在全局命名空间的——这样使得多个模块能够对同一个 action 或 mutation 作出响应。Getter 同样也默认注册在全局命名空间,但是目前这并非出于功能上的目的(仅仅是维持现状来避免非兼容性变更)。必须注意,不要在不同的、无命名空间的模块中定义两个相同的 getter 从而导致错误。
如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true
的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。
模块注册方式:modules和registerModule
modules方式:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const stateData = {
functionType: '', //运行类型FORMAL_OPERATION_PROJECT正式,INFORMAL_OPERATION_PROJECT-非正式
consignInfo: '', //合同信息-甲方(客户)
transportInfo: '', //签约主体-乙方
contractTime: '', //承运合同-合同时间
isSameShipper: false, //收货方是否同发货方
shipper: {}, //发货方
projectName: '', //项目名称
commissionRate: 0 //佣金比例
}
const mutations = {
setFunctionType(state, val) {
state.functionType = val
},
setConsignInfo(state, val) {
state.consignInfo = val
},
setTransportInfo(state, val) {
state.transportInfo = val
},
setContractTime(state, val) {
state.contractTime = val
},
setIsSameShipper(state, val) {
state.isSameShipper = val
},
setShipper(state, val) {
state.shipper = val
},
setProjectName(state, val) {
state.projectName = val
},
setCommissionRate(state, val) {
state.commissionRate = val
}
}
const getters = {
functionType: (state) => {
return state.functionType
},
consignInfo: (state) => {
return state.consignInfo
},
transportInfo: (state) => {
return state.transportInfo
},
contractTime: (state) => {
return state.contractTime
},
isSameShipper: (state) => {
return state.isSameShipper
},
shipper: (state) => {
return state.shipper
},
projectName: (state) => {
return state.projectName
},
commissionRate: (state) => {
return state.commissionRate
}
}
const add = {
namespaced: true,
state: () => _.cloneDeep(stateData),
mutations,
getters,
actions: {}
}
const edit = {
namespaced: true,
state: () => _.cloneDeep(stateData),
mutations,
getters,
actions: {}
}
export default new Vuex.Store({
modules: {
add,
edit
}
})
registerModule方式:
import Vue from 'vue';
import Vuex from 'vuex';
import {
store
} from '@gtff/tdesign-gt-vue';
import zrsq from './modules/zrgl/zrsq';
import comlq from './modules/comlq';
const initStore = store.init(Vue, Vuex);
initStore.registerModule('index', {
namespaced: true,
state: {
user: 'index name',
userId: '10214406000000023059',
},
getters: {
userId(state) {
console.log(new Date())
return state.userId
}
},
mutations: {
changeUserId(state, id) {
state.userId = id;
}
},
actions: {
changeUserIdFun({ commit }, args) {
commit('changeUserId', args)
}
}
});
initStore.registerModule('zrsq', zrsq);
initStore.registerModule('comlq', comlq);
export default initStore;
页面使用:
import { mapGetters, mapState, mapActions, mapMutations } from 'vuex'
export default {
computed: {
// ...mapGetters(['userId']),
...mapGetters(['index/userId']),
...mapState({
userId1: state => state.index.userId
}),
},
mounted() {
console.log('state userId', this.$store.state.index.userId)
console.log('state mapState userId', this.userId1)
//getters
console.log('getters userId', this.$store.getters['userId'])
console.log('getters mapGetters userId', this['userId'])
//getters-命名空间
console.log('getters userId', this.$store.getters['index/userId'])
console.log('getters mapGetters userId', this['index/userId'])
//mutations
this.$store.commit('changeUserId', '223333')
this['changeUserId']('4445555')
//actions
this.$store.dispatch('changeUserIdFun', 'aaaaaa')
this['changeUserIdFun']('bbbbb')
//mutations-命名空间
this.$store.commit('index/changeUserId', '223333')
this['index/changeUserId']('4445555')
//actions-命名空间
this.$store.dispatch('index/changeUserIdFun', 'aaaaaa')
this['index/changeUserIdFun']('bbbbb')
},
methods: {
// ...mapMutations(['index/changeUserId']),
// ...mapActions(['index/changeUserIdFun']),
...mapMutations(['changeUserId']),
...mapActions(['changeUserIdFun']),
},
};