Vuex 状态管理器

2019-08-21  本文已影响0人  Do_Du

全局状态管理,在任意组件里通用,可以进行获取、修改,并且修改的值会得到全局的响应变更。

总结:
1、获取变量值xxx:this.store.xxx;或者通过更好的方法 getters 2、改变初始变量值: this.store.commit('SET_TOKEN', '123456789')

1、安装

npm install vuex --save

2、在src目录下新建一个名为store的文件夹,为方便引入在store文件夹里新建一个index.js,js里引入vue和vuex,vue引用vuex,并初始化store,最后暴露出去。代码如下:

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store();

export default store;

3、在main.js里引入store,再全局注入,这样就可以再任一组件通过this.$store.xxx 获取变量值xxx

import store from './store'

new Vue({
  el: '#app',
  router,
  store,
  template: '<App/>',
  components: {App}
})

下面开始state

1、定义初始变量
在store文件夹里的index.js里,引入Vue和Vuex 并使用,再声明一个state变量对象,内含所有的变量初始化,再把state对象赋值给store,并暴露store出去

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const state = { // 设置全局访问的state对象
  token: '', // 设置初始属性值
  name: '',
  avatar: ''
};
const store = new Vuex.store({
  state
});
export default store;

2、通过getters获取变量值

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const state = { // 设置全局访问的state对象
  token: '', // 设置初始属性值
  name: '',
  avatar: ''
};
const getters = {
  getToken(state) {
    return state.token
  },
  getName(state) {
    return state.name
  }
};
const store = new Vuex.store({
  state,
  getters 
});
export default store;

3、通过mutattions改变初始变量值
改变初始变量值: this.$store.commit('SET_TOKEN', '123456789')

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const state = { // 设置全局访问的state对象
  token: '', // 设置初始属性值
  name: '',
  avatar: ''
};
const getters = {
  getToken(state) {
    return state.token
  },
  getName(state) {
    return state.name
  }
};
const mutations = {
  SET_TOKEN: (state, token) => { // 这里的token是新的要传入的值
    state.token = token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles
  }
}
const store = new Vuex.store({
  state,
  getters,
  mutations
});
export default store;

但是mutations里面的方法 都是同步事务,意思就是说:比如这里的一个this.$store.commit('SET_TOKEN','123456789')方法,两个组件里用执行得到的值,每次都是一样的,这样肯定不是理想的需求

4、通过Actions异步触发mutations里面的方法
改变初始变量值:this.$store.dispatch('login',data)

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const state = { // 设置全局访问的state对象
  token: '', // 设置初始属性值
  name: '',
  avatar: ''
};
const getters = {
  getToken(state) {
    return state.token
  },
  getName(state) {
    return state.name
  }
};
const mutations = {
  SET_TOKEN: (state, token) => { // 这里的token是新的要传入的值
    state.token = token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles
  }
};
const actions = { // 可以直接commit mutations里面地方方法如changeName,也可以写信逻辑如login
    login({ commit }, userInfo) {
     const { username, password } = userInfo
     return new Promise((resolve, reject) => {
       login({ username: username.trim(), password: password }).then(response => {
         const { data } = response
         commit('SET_TOKEN', data.token)
         setToken(data.token)
         resolve()
       }).catch(error => {
         reject(error)
       })
     })
  },
 changeName({ commit }, data) {
   commit('SET_NAME', data)
 }
};
const store = new Vuex.store({
  state,
  getters,
  mutations,
  actions
});
export default store;
上一篇下一篇

猜你喜欢

热点阅读