「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
相同点:mutations和action都是用来改变Vuex store的状态的;
不同点:mutations提供的回调函数是同步的;
而actions提供的方法是异步的,此外,actions的方法最终还是通过调用mutations的方法来实现修改vuex的状态的。
dispatch:含有异步操作,例如向后台提交数据,写法: this.$store.dispatch('actions方法名',值)
commit:同步操作,写法:this.$store.commit('mutations方法名',值)
下拉框数据
1.user.js
主要看state里的userData
mutations里的SET_USERDATA
actions里的login、allLogin
// import { login, logout, getInfo } from '@/api/user'
import api from '@/api/index'
import { getToken, setToken, removeToken } from '@/utils/auth'
import router, { resetRouter } from '@/router'
const state = {
token: getToken(),
name: '',
avatar: '',
introduction: '',
roles: [],
userData: sessionStorage.getItem('userData') != null ? JSON.parse(sessionStorage.getItem('userData')) : {}
}
const mutations = {
SET_TOKEN: (state, token) => {
state.token = token
},
SET_INTRODUCTION: (state, introduction) => {
state.introduction = introduction
},
SET_NAME: (state, name) => {
state.name = name
},
SET_AVATAR: (state, avatar) => {
state.avatar = avatar
},
SET_ROLES: (state, roles) => {
state.roles = roles
},
SET_USERDATA: (state, data) => {
state.userData = data
sessionStorage.setItem('userData', JSON.stringify(data))
}
}
const actions = {
// user login
login({ commit }, userInfo) {
const { userName } = userInfo
return new Promise((resolve, reject) => {
api.newlogin({ uid: userName.trim() }).then(response => {
const { data } = response
commit('SET_TOKEN', data.token)
commit('SET_USERDATA', data)
// console.log(data.token, '2222')
setToken(data.token)
resolve()
}).catch(error => {
reject(error)
})
})
},
allLogin({ commit }, userInfo) {
return new Promise((resolve, reject) => {
api.byToken({ token: userInfo }).then(response => {
const { data } = response
commit('SET_USERDATA', data)
resolve()
}).catch(error => {
reject(error)
})
})
},
// get user info
getInfo({ commit, state }) {
return new Promise((resolve, reject) => {
// api.newgetInfo(state.token).then(response => {
// const { data } = response
// if (!data) {
// reject('Verification failed, please Login again.')
// }
// const { roles, name, avatar, introduction } = data
// // roles must be a non-empty array
// if (!roles || roles.length <= 0) {
// reject('getInfo: roles must be a non-null array!')
// }
var data = {
roles: ['admin']
}
commit('SET_ROLES', ['admin'])
commit('SET_NAME', 'admin')
// commit('SET_AVATAR', avatar)
// commit('SET_INTRODUCTION', introduction)
resolve(data)
// }).catch(error => {
// reject(error)
// })
})
},
// user logout
logout({ commit, state }) {
return new Promise((resolve, reject) => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resetRouter()
resolve()
// logout(state.token).then(() => {
// commit('SET_TOKEN', '')
// commit('SET_ROLES', [])
// removeToken()
// resetRouter()
// resolve()
// }).catch(error => {
// reject(error)
// })
})
},
// remove token
resetToken({ commit }) {
return new Promise(resolve => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resolve()
})
},
// dynamically modify permissions
changeRoles({ commit, dispatch }, role) {
return new Promise(async resolve => {
const token = role + '-token'
commit('SET_TOKEN', token)
setToken(token)
const { roles } = await dispatch('getInfo')
resetRouter()
// generate accessible routes map based on roles
const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
// dynamically add accessible routes
router.addRoutes(accessRoutes)
// reset visited views and cached views
dispatch('tagsView/delAllViews', null, { root: true })
resolve()
})
}
}
export default {
namespaced: true,
state,
mutations,
actions
}
2.将user.js写入getters.js中
const getters = {
token: state => state.user.token,
avatar: state => state.user.avatar,
name: state => state.user.name,
introduction: state => state.user.introduction,
roles: state => state.user.roles,
}
3.触发这个vuex生成数据(dispatch触发actions里的方法)
dispatch:含有异步操作,例如向后台提交数据,写法: this.$store.dispatch('actions方法名',值)
commit:同步操作,写法:this.$store.commit('mutations方法名',值)
// 1.不需要传参的触发
this.$store.dispatch('user/logout')
// 2.触发时需要传参
this.$store.dispatch('user/changeRoles', val).then(() => {...})
this.$store.dispatch('user/allLogin', Cookies.get('token')) // 接口传参token获取登录信息 并存到vuex里userData
this.$store.dispatch('user/login', this.loginForm).then(() => { // 登录接口的触发存储,this.loginForm(账号、密码...)
// this.selectInfo()
this.loading = false
this.$router.push({
path: this.redirect || '/',
query: this.otherQuery
})
})
.catch(res => {
this.$tips({
content: res,
type: 'error'
})
this.loading = false
})
4.使用vuex数据
this.$store.getters.name // 写入了getters.js文件里 需这样使用
this.$store.state.user.userData.employeeName // userData未写入getters.js文件里 所以得这样使用