# Vuex 实践
# 目录结构
在根目录下创建 store
文件夹
@/store/modules
是模块存储地址
@/store/getters
高频使用字段可提到全局 getters
@/store/index
主文件
# 模块结构
const state = {};
const mutations = {};
const actions = {};
export default {
namespaced: true,
state,
mutations,
actions,
};
# getters
export default {
sidebar: (state) => state.app.sidebar,
token: (state) => state.user.token,
roles: (state) => state.user.roles,
};
# 主文件
import Vue from "vue";
import Vuex from "vuex";
import getters from "./getters";
import app from "./modules/app";
Vue.use(Vuex);
const store = new Vuex.Store({
state: {},
getters,
modules: {
app,
},
});
export default store;
在项目入口文件 main.js
中引入并注册
import store from "./store";
new Vue({
router,
store,
render: (h) => h(App),
}).$mount("#app");
# 业务中使用
直接访问 store
<template>
<sidebar :theme="navTheme" :collapsed="$store.state.app.sidebar" />
<span>{{ $store.getters.userName }} </span>
<a-icon class="trigger" @click="$store.dispatch('app/toggleSideBar')" />
</template>
<script>
clickHandle() {
this.$store.dispatch('user/logout')
}
</script>
通过辅助函数访问
<template>
<a-icon class="trigger" @click="toggleSideBar" />
</template>
<script>
import { mapGetters, mapActions } from 'vuex'
computed: {
...mapGetters(['sidebar'])
},
metheds: {
...mapActions('app', ['toggleSideBar'])
}
</script>
A/B 模块间相互通信
const actions = {
getUserInfo({ commit, dispatch, state, rootState, rootGetters }) {
console.log(rootState.user.name); // 调用user模块的 actions
console.log(rootGetters["user/pay"]); // 调用user模块的 getters
commit("user/SET_NAME", "", { root: true }); // 调用user模块的 mutations
dispatch("user/getInfo", {}, { root: true }); // 调用user模块的 actions
},
};
详细的用法,参考 Vuex