Vuex store 的状态管理如下图。
//普通定义的index.js
import Vue from 'vue';
import Vuex from 'vuex';
import { dataService } from '../shared';
import { GET_HEROES } from './mutation-types'
Vue.use(Vuex);
const state = {
heroes: [],
};
const mutations = {
[GET_HEROES](state, heroes) {
state.heroes = heroes;
},
};
const actions = {
async getHeroesAction({ commit }) {
const heroes = await dataService.getHeroes();
commit(GET_HEROES, heroes);
},
};
const getters = {
getHeroById: (state, id) => {
state.heroes.find(h => {
if (h.id === id)
return h;
})
},
};
export default new Vuex.Store({
state,
mutations,
actions,
getters,
})
mutations 的定义使用了ES2015风格的 computed 属性名,参考 Vuex 官方文档
https://vuex.vuejs.org/guide/mutations.html
It is a commonly seen pattern to use constants for mutation types in various Flux implementations. This allows the code to take advantage of tooling like linters, and putting all constants in a single file allows your collaborators to get an at-a-glance view of what mutations are possible in the entire application:
// vue_element_admin 定义 index.js
import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
import app from './modules/app'
import settings from './modules/settings'
import user from './modules/user'
Vue.use(Vuex)
const store = new Vuex.Store({
modules: {
app,
settings,
user
},
getters
})
export default store
vue_admin 中 token state 定义在 user.js
// vue_admin user.js
import { login, logout, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'
const state = {
token: getToken(),
name: '',
avatar: ''
}
const mutations = {
SET_TOKEN: (state, token) => {
state.token = token
},
SET_NAME: (state, name) => {
state.name = name
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
}
}
const actions = {
// user login
login({ commit }, userInfo) {
const { username, password } = userInfo
return new Promise((resolve, reject) => {
login({ username: username.trim(), password: password }).then(response => {
// console.log("I am in store/modules/user.js, print response!");
// console.log(response);
const { data } = response
// console.log('JWT '+data.items.token);
var JWTtoken = 'JWT '+data.items.token;
commit('SET_TOKEN', JWTtoken)
setToken(JWTtoken)
resolve()
}).catch(error => {
reject(error)
})
})
},
// get user info
getInfo({ commit }) {
return new Promise((resolve, reject) => {
getInfo().then(response => {
const { data } = response
if (!data) {
reject('Verification failed, please Login again.')
}
const { name, avatar } = data
commit('SET_NAME', name)
commit('SET_AVATAR', avatar)
resolve(data)
}).catch(error => {
reject(error)
})
})
},
// user logout
logout({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
commit('SET_TOKEN', '')
removeToken()
resetRouter()
resolve()
}).catch(error => {
reject(error)
})
})
},
// remove token
resetToken({ commit }) {
return new Promise(resolve => {
commit('SET_TOKEN', '')
removeToken()
resolve()
})
}
}
export default {
namespaced: true,
state,
mutations,
actions
}
// placeholder
// placeholder
// placeholder
// placeholder
// placeholder
// placeholder