actions的使用

作用:修改 state 数据,异步修改。

10.3 节讲解 mutations 修改 state 中的数据,但 mutations 只能同步修改。如果 mutations 出现异步操作,那么则不能继续操作 state 中的数据,而要在 mutations 中模拟异步操作,接 10.3.1 节代码,如下所示。

Vuex 代码如下。

mutations: {
  getAdd(state, data) {
    // 使用 setTimeout 模拟异步操作
    setTimeout(() => {
      state.num++;
      console.log(data);
    }, 1000);
  }
}

HelloWorld 组件代码不变,此时单击自增按钮,会出现页面中的数据和 state 中的数据不统一的情况。

出现数据不统一说明 mutations 不能操作异步数据,需要使用 actions,代码如下。

Vuex 代码如下。

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

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    num: 10
  },
  getters: {
    newnum(state) {
      return state.num + '元';
    }
  },
  mutations: {
    getAdd(state) {
      state.num++;
      console.log(data); // 注意: 此处的 data 是 undefined,应在 commit 时传入
    }
  },
  actions: {
     //1.定义方法,传入形参
    getAddActions({ commit }) { // actions 传入 context 对象
      //2.使用commit方法触发mutations中的方法
      commit('getAdd'); // 通过 context.commit 调用 mutation
    }
  }
});

export default store;

代码解析如下。

actions 中的方法并不能直接操作 state 中的数据,需要触发 mutations 中的方法,最终还得通过 mutations 中的方法修改数据。

HelloWorld 组件代码如下。

methods: {
  addnum() {
    // mutations 处理同步
    // this.$store.commit('getAdd', { id: 1, name: '小明' }); // 如果需要传递参数,可以这样写
    // actions 处理异步
    this.$store.dispatch('getAddActions'); // 如果 action 不需要参数,可以这样写

    // 或者,传递参数给 action
    // const payload = { id: 1, name: '小明' };
    // this.$store.dispatch('getAddActions', payload);
  }
}

代码解析如下。

通过 this.$store.dispatch 触发 actions 中的方法,运行程序,可以实现页面和 state 数据统一,最后在 actions 中模拟异步操作,代码如下。

actions: {
  getAddActions({ commit }) { // 使用解构赋值,直接获取 commit
    setTimeout(() => {
      commit('getAdd');
    }, 1000);
  }
}

运行程序,HelloWorld 中的数据和 state 中的数据可以实现统一,说明操作异步数据要使用 actions。

下面讲解异步参数传递。

在调用 actions 中方法时,同样可以把组件中的数据传递给 Vuex,代码如下。

HelloWorld 组件代码如下。

methods: {
  addnum() {
    // 传递数字 100
    this.$store.dispatch('getAddActions', 100);
  }
}

Vuex 组件代码如下。

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

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    num: 10
  },
  getters: {
    newnum(state) {
      return state.num + '元';
    }
  },
  mutations: {
    // 3. 最终在 mutations 中接收用户传递的数据
    getAdd(state, data) {
      state.num++;
      console.log(data);
    }
  },
  actions: {
    // 1. 在方法中接收
    getAddActions(context, data) {
      setTimeout(() => {
        // 2. 触发 mutations 中方法时传递数据
        context.commit('getAdd', data);
      }, 1000);
    }
  }
});

export default store;

代码解析如下。

首先在 actions 中的方法接收数据,等触发 mutations 中方法时把接收的数据传递出去,最终在 mutations 中的方法接收数据。