VueJS - Vuex在突变中分配数据

时间:2017-05-05 15:13:24

标签: vue.js vuex

我已经习惯了Vuex,因为我需要能够拥有一个我可以轻松访问的商店,并在更改另一个组件时进行更新。

目前,我的store如下所示:

import vue from 'vue';
import Vuex from 'vuex';

vue.use(Vuex);

export default new Vuex.Store({
    state: {
        users: {

            columns: [],
            model:   [],

        }
    },

    mutations: {
        fetchUsers: function(state) {
          axios.get(`/users?search_input=`)
            .then(function(response) {


            });
        }
    }

});

从{ajax请求动态下拉columnsmodel,我的Users如下所示:

<script>

  export default {

    mounted() {
      this.$store.commit('fetchUsers'); 
    },
    computed: {
        columns() {
            return this.$store.state.users.columns;
        }

        model() {
            return this.$store.state.users.model
        }
    },
  }

</script>

我的问题是应用程序需要从Ajax预加载数据。例如,columns是根据fetchUsers中的ajax请求设置的,Users内部使用this.$store.commit('fetchUsers');设置commit但是有一种替代方法可以在不使用{{1}的情况下执行此操作最好是在商店里面?

2 个答案:

答案 0 :(得分:2)

在商店中,您可以通过操作异步加载数据,然后使用突变提交更改。

import vue from 'vue';
import Vuex from 'vuex';

vue.use(Vuex);

export default new Vuex.Store({
  state: {
    users: {
      columns: [],
      model:   [],
    }
  },

  actions: {
    fetchUsers: function( context ) {
      axios.get(`/users?search_input=`)
      .then( function( response ) {
        context.commit( "FETCHUSERS", {
          columns: response.columns,
          model: response.model
        });  
      });   
    }
  }
  mutations: {
    FETCHUSERS: function( state, payload ) {
      state.users.columns = payload.columns;
      state.users.model = payload.model;
    }
  }
});

从组件

发送操作
<script>
  export default {
    .....
    methods: {
      fetchUsers: function() {
       this.$store.dispatch( "fetchUsers" );
      }
    }
  }
</script>

答案 1 :(得分:1)

突变必须是同步的:https://vuex.vuejs.org/en/mutations.html

您应该将ajax请求移动到actions,这可以是异步的。您在action中获取数据,提交变异,将接收到的数据作为有效负载,并且变异为state属性赋值。

或者,您可以在组件方法中创建异步请求,并直接为store属性赋值:this.$store.state.prop = value