不能在mutation的函数中执行异步操作,因为如果在这里面进行异步操作,虽然页面发生改变,但是vuetool这个工具中数据没有发生改变。
action用于处理异步任务,通过触发mutation中的函数间接更新state的数据

1.触发Actions的第一种方式

1.1首先在store的Action中定义一个事件,将异步任务放入其中,事件中第一个参数context,通过commit进行进行调用,可以拿到mutation中的事件,通过修改mutation中的事件来改变state。

  1. state: {
  2. count:0
  3. },
  4. mutations: {
  5. add(state,num){
  6. state.count++
  7. }
  8. },
  9. actions: {
  10. addAsync(context){
  11. setTimeout(()=>{
  12. context.commit("add")
  13. },1000)
  14. }
  15. },

1.2在组件中通过this.$store.dispatch来调用异步事件

  1. methods: {
  2. handleAddClick(){
  3. this.$store.dispatch("addAsync")
  4. }
  5. },

2.触发Actions异步任务携带参数第一种方式

2.1在组件中将参数传递进去,第二个参数就是从外界传递进入的参数

  1. methods: {
  2. handleAddClick(){
  3. this.$store.dispatch("addAsync",3)
  4. }
  5. },

2.2在store中进行action中定义一个事件,第二个参数与上面的对应,通过context.commit(“add”,num1),将该参数传递到mutation中,这里的参数是num1,在mutations这种去接受这个外界传来的参数

  1. export default new Vuex.Store({
  2. state: {
  3. count:0
  4. },
  5. mutations: {
  6. add(state,num1){
  7. state.count+=num1
  8. },
  9. reduce(state,num1){
  10. state.count-=num1
  11. }
  12. },
  13. actions: {
  14. addAsync(context,num1){
  15. setTimeout(()=>{
  16. context.commit("add",num1)
  17. },1000)
  18. }
  19. },

image.png

3.触发Action的第二种方式

3.1首先在组件导入该vuex的mapActions函数

  1. import {mapActions} from "vuex"

3.2在methods中把对应的mapActions函数映射过来

  1. methods: {
  2. ...mapActions(['reduceASync']),
  3. redudceClick(){
  4. this.reduceASync()
  5. }
  6. },

4.触发Actions异步任务携带参数第二种方式

组件中

  1. methods: {
  2. ...mapActions(['reduceASync']),
  3. redudceClick(){
  4. //这里传过去一个3
  5. this.reduceASync(3)
  6. }
  7. },

在store中,这里的num2对应传递过来的3

  1. export default new Vuex.Store({
  2. state: {
  3. count:0
  4. },
  5. mutations: {
  6. reduce(state,num2){
  7. state.count-=num2
  8. }
  9. },
  10. actions: {
  11. reduceASync(context,num2){
  12. setTimeout(()=>{
  13. context.commit("reduce",num2)
  14. },1000)
  15. }
  16. },
  17. })