美文网首页
Vuex 状态管理器

Vuex 状态管理器

作者: Do_Du | 来源:发表于2019-08-21 18:03 被阅读0次

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

    总结:
    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;
    

    相关文章

      网友评论

          本文标题:Vuex 状态管理器

          本文链接:https://www.haomeiwen.com/subject/raeisctx.html