src文件夹下创建store文件夹,内部创建modules文件夹(存储分类vuex)和index.js文件(整合vuex)和getters.js文件(存储vuex计算属性,所有vuex都计算都写在这)
index.js文件内部
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
import app from './modules/app'
import user from './modules/user'
Vue.use(Vuex)
const store = new Vuex.Store({
modules: {
app,
user
},
getters
})
export default store
modules文件夹内部创建各个文件(app.js | user.js)演示user.js内部
import { login } from '@/api/user'
const getDefaultState = () => {
return {
token: localStorage.getItem('token') || ''
}
}
const state = getDefaultState()
const mutations = {
SET_TOKEN: (state, token) => {
state.token = token
}
}
const actions = {
async login({ commit }, userInfo) {
const { username, password } = userInfo;
let result = await login({ username: username.trim(), password: password });
if(result.code==20000){
commit('SET_TOKEN',result.data.token);
localStorage.setItem('token',JSON.stringify(result.data.token))
return 'ok';
}else{
return Promise.reject(new Error('faile'));
}
}
}
export default {
namespaced: true,
state,
mutations,
actions
}
getters.js文件内部
const getters = {
sidebar: state => state.app.sidebar,
name: state => state.user.name,
}
export default getters
使用
方法一:
const name = this.$store.getters.name
方法二(常用):
import { mapGetters } from 'vuex'
computed: {
...mapGetters([ 'name' ]),
name() {
return this.name
}
}
方法一(常用):
methods: {
handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
}
}
方法二:
import { mapActions } from 'vuex'
methods: {
...mapActions([ 'handleLogOut' ])
}
方法一:
computed: {
sidebar() {
return this.$store.state.app.sidebar
}
}
方法二(常用):
import { mapState } from "vuex";
computed: {
...mapState({
sidebar: (state) => state.app.sidebar
})
}
方法三:
import { mapGetters } from 'vuex'
computed: {
...mapGetters([ 'sidebar' ]),
Sidebar() {
return this.sidebar
}
}