Vuex分模块使用记录
前言,突然想试试vuex,以前只是单纯的以为vuex只是存储一个状态,今天看了一个github上的一个项目,我看别人把需要的数据也放在vuex上面,我不知道这样利不利于优化,但是我知道这样会方便一些,你需要的数据直接从vuex里面取就好了。/src/main.jsimport Vue from 'vue';import iView from 'iview';import {ro...
·
前言,突然想试试vuex,以前只是单纯的以为vuex只是存储一个状态,今天看了一个github上的一个项目,我看别人把需要的数据也放在vuex上面,我不知道这样利不利于优化,但是我知道这样会方便一些,你需要的数据直接从vuex里面取就好了。
/src/main.js
import Vue from 'vue';
import iView from 'iview';
import {router} from './router/index';
import {appRouter} from './router/router';
import store from './store';
import App from './app.vue';
import '@/locale';
import 'iview/dist/styles/iview.css';
import VueI18n from 'vue-i18n';
import util from './libs/util';
Vue.use(VueI18n);
Vue.use(iView);
new Vue({
el: '#app',
router: router,
store: store,
render: h => h(App),
data: {
currentPageName: ''
},
mounted () {
this.currentPageName = this.$route.name;
// 显示打开的页面的列表
this.$store.commit('setOpenedList');
this.$store.commit('initCachepage');
// 权限菜单过滤相关
this.$store.commit('updateMenulist');
// iview-admin检查更新
util.checkUpdate(this);
},
created () {
let tagsList = [];
appRouter.map((item) => {
if (item.children.length <= 1) {
tagsList.push(item.children[0]);
} else {
tagsList.push(...item.children);
}
});
this.$store.commit('setTagsList', tagsList);
}
});
/src/store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import app from './modules/app';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
//
},
mutations: {
},
actions: {
//
},
modules: {
app,
}
});
export default store;
/src/store/modules/app.js
import {otherRouter, appRouter} from '@/router/router';
import Util from '@/libs/util';
import Cookies from 'js-cookie';
import Vue from 'vue';
const app = {
state: {
cachePage: [],
lang: '',
isFullScreen: false,
openedSubmenuArr: [], // 要展开的菜单数组
menuTheme: 'dark', // 主题
themeColor: '',
pageOpenedList: [{
title: '首页',
path: '',
name: 'home_index'
}],
currentPageName: '',
currentPath: [
{
title: '首页',
path: '',
name: 'home_index'
}
], // 面包屑数组
menuList: [],
routers: [
otherRouter,
...appRouter
],
tagsList: [...otherRouter.children],
messageCount: 0,
dontCache: ['text-editor', 'artical-publish'] // 在这里定义你不想要缓存的页面的name属性值(参见路由配置router.js)
},
mutations: {
setTagsList (state, list) {
state.tagsList.push(...list);
},
updateMenulist (state) {
let accessCode = parseInt(Cookies.get('access'));
let menuList = [];
appRouter.forEach((item, index) => {
if (item.access !== undefined) {
if (Util.showThisRoute(item.access, accessCode)) {
if (item.children.length === 1) {
menuList.push(item);
} else {
let len = menuList.push(item);
let childrenArr = [];
childrenArr = item.children.filter(child => {
if (child.access !== undefined) {
if (child.access === accessCode) {
return child;
}
} else {
return child;
}
});
menuList[len - 1].children = childrenArr;
}
}
} else {
if (item.children.length === 1) {
menuList.push(item);
} else {
let len = menuList.push(item);
let childrenArr = [];
childrenArr = item.children.filter(child => {
if (child.access !== undefined) {
if (Util.showThisRoute(child.access, accessCode)) {
return child;
}
} else {
return child;
}
});
if (childrenArr === undefined || childrenArr.length === 0) {
menuList.splice(len - 1, 1);
} else {
let handledItem = JSON.parse(JSON.stringify(menuList[len - 1]));
handledItem.children = childrenArr;
menuList.splice(len - 1, 1, handledItem);
}
}
}
});
state.menuList = menuList;
},
changeMenuTheme (state, theme) {
state.menuTheme = theme;
},
changeMainTheme (state, mainTheme) {
state.themeColor = mainTheme;
},
addOpenSubmenu (state, name) {
let hasThisName = false;
let isEmpty = false;
if (name.length === 0) {
isEmpty = true;
}
if (state.openedSubmenuArr.indexOf(name) > -1) {
hasThisName = true;
}
if (!hasThisName && !isEmpty) {
state.openedSubmenuArr.push(name);
}
},
closePage (state, name) {
state.cachePage.forEach((item, index) => {
if (item === name) {
state.cachePage.splice(index, 1);
}
});
},
initCachepage (state) {
if (localStorage.cachePage) {
state.cachePage = JSON.parse(localStorage.cachePage);
}
},
removeTag (state, name) {
state.pageOpenedList.map((item, index) => {
if (item.name === name) {
state.pageOpenedList.splice(index, 1);
}
});
},
pageOpenedList (state, get) {
let openedPage = state.pageOpenedList[get.index];
if (get.argu) {
openedPage.argu = get.argu;
}
if (get.query) {
openedPage.query = get.query;
}
state.pageOpenedList.splice(get.index, 1, openedPage);
localStorage.pageOpenedList = JSON.stringify(state.pageOpenedList);
},
clearAllTags (state) {
state.pageOpenedList.splice(1);
state.cachePage.length = 0;
localStorage.pageOpenedList = JSON.stringify(state.pageOpenedList);
},
clearOtherTags (state, vm) {
let currentName = vm.$route.name;
let currentIndex = 0;
state.pageOpenedList.forEach((item, index) => {
if (item.name === currentName) {
currentIndex = index;
}
});
if (currentIndex === 0) {
state.pageOpenedList.splice(1);
} else {
state.pageOpenedList.splice(currentIndex + 1);
state.pageOpenedList.splice(1, currentIndex - 1);
}
let newCachepage = state.cachePage.filter(item => {
return item === currentName;
});
state.cachePage = newCachepage;
localStorage.pageOpenedList = JSON.stringify(state.pageOpenedList);
},
setOpenedList (state) {
state.pageOpenedList = localStorage.pageOpenedList ? JSON.parse(localStorage.pageOpenedList) : [otherRouter.children[0]];
},
setCurrentPath (state, pathArr) {
state.currentPath = pathArr;
},
setCurrentPageName (state, name) {
state.currentPageName = name;
},
setAvator (state, path) {
localStorage.avatorImgPath = path;
},
switchLang (state, lang) {
state.lang = lang;
Vue.config.lang = lang;
},
clearOpenedSubmenu (state) {
state.openedSubmenuArr.length = 0;
},
setMessageCount (state, count) {
state.messageCount = count;
},
increateTag (state, tagObj) {
if (!Util.oneOf(tagObj.name, state.dontCache)) {
state.cachePage.push(tagObj.name);
localStorage.cachePage = JSON.stringify(state.cachePage);
}
state.pageOpenedList.push(tagObj);
localStorage.pageOpenedList = JSON.stringify(state.pageOpenedList);
}
}
};
export default app;
##上面是大佬的项目,我直接粘出源码了,下面是我模仿写的简化版
/src/main.js
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
import baseURL from './common/baseURL'
import iview from 'iview'
import 'iview/dist/styles/iview.css';
Vue.use(iview)
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})
/src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import app from './modules/app'
Vue.use(Vuex)
export default new Vuex.Store({
modules:{ //当多个状态的时候,我们会书写很多的代码,为了拆分模块化,所以我们可以在其他地方定义,然后在modules里面整合。官方文档有介绍。。。。。
app
}
})
/src/store/modules/app.js
const app = {
state: {
count: 1,
},
mutations: {
changeCount (state) {
state.count ++
}
}
}
export default app;
组件中使用
export default {
methods: {
methodsCount () {
//找到实例使用commit触发(更改)count的状态。
this.$store.commit('app/changeCount')
}
}
}
更多推荐
已为社区贡献5条内容
所有评论(0)