Vuex从入门到实战(四)——Actions实现异步操作

news/2024/7/10 3:00:41 标签: vue, vuex, actions

一、Action用于处理异步任务

如果通过异步操作变更数据,必须通过Action,而不能使用Mutation。但是在Action中还是要通过触发Mutation的方式间接变更数据。
在这里插入图片描述
只有mutation中定义的函数,才有权利去修改state中的数据,因此actions最终还是要调用mutation
在这里插入图片描述

vuedevtools_5">二、扩展:vue-devtools

有了vue-devtools我们可以直观的观察到组件和触发事件。下图为vue-devtools常用功能的简单介绍,下载教程:https://blog.csdn.net/weixin_43361722/article/details/116494776
在这里插入图片描述

现在我们来改动一下上节的计数器demo,体验一下Actions,看一下触发actions的两种方式。

仔细看state、mutation、actions,包括下节的getters的定义及触发有很多相似之处。

actions_15">三、触发actions的两种方式

  1. 改动store/index.js——定义actions
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    add (state) {
      state.count++
    },
    addN (state, step) {
      setTimeout(() => {
        state.count += step
      }, 1000)
    },
    sub (state) {
      state.count--
    },
    subN (state, step) {
      state.count -= step
    }
  },
  // -------------------------------新增actions处理异步
  actions: {
  	// context是和store对象具有相同方法和属性的对象
    addAsync (context) {
      setTimeout(() => {
      	// 在 actions 中,不能直接修改 state 中的数据;
      	// 必须通过 contex.commit() 触发某个 mutation 才行;
        context.commit('add')
      }, 1000)
    },
    // 异步也是可以传参的,这里的step为我们的形参
    addNAsync (context, step) {
      setTimeout(() => {
        context.commit('addN', step)
      }, 1000)
    },
    subAsync (context) {
      setTimeout(() => {
        context.commit('sub')
      }, 1000)
    },
    subNAsync (context, step) {
      setTimeout(() => {
        context.commit('subN', step)
      }, 1000)
    }
  }
  // -------------------------------
})

  1. 改动Addition组件——实践第一种方式:$store.dispatch触发actions
<template>
    <div>
        <p>当前count的值为:{{ $store.state.count}}</p>
        <button @click="handleAdd()">+1</button>
        <button @click="handleAddN()">+N</button>
        <!-- 这里的 dispatch 函数专门来触发 actions -->
        <!-- 这节调用方式没有再写methods -->
        <button @click="$store.dispatch('addAsync')">+1 Async</button>
        <button @click="$store.dispatch('addNAsync', 5)">+N Async</button>
        <!-- ---------------------------------- -->
    </div>
</template>

<script>
export default {
  data () {
    return {}
  },
  methods: {
    handleAdd () {
      this.$store.commit('add')
    },
    handleAddN () {
      this.$store.commit('addN', 3)
    }
  }
}
</script>
  1. 改动Subtraction组件——实践第二种方式:mapActions触发actions
<template>
    <div>
        <p>当前count的值为:{{ count }}</p>
        <button @click="handleSub()">-1</button>
        <button @click="handleSubN()">-N</button>
        <!-- 3.已经映射为methods函数可以直接调用无须再写handle函数 -->
        <button @click="subAsync()">-1 Async</button>
        <button @click="subNAsync(5)">-N Async</button>
    </div>
</template>

<script>
// 1.从vuex中按需导入mapActions
import { mapState, mapMutations, mapActions } from 'vuex'

export default {
  data () {
    return {}
  },
  computed: {
    ...mapState(['count'])
  },
  methods: {
    ...mapMutations(['sub', 'subN']),
    // 2. 将指定的actions函数,映射为当前组件的methos函数
    ...mapActions(['subAsync', 'subNAsync']), 
    handleSub () {
      this.sub()
    },
    handleSubN () {
      this.subN(3)
    }

  }
}
</script>


http://www.niftyadmin.cn/n/1486172.html

相关文章

Vuex从入门到实战(五)——Getters加工处理公共数据

一、Getter Getter用于对Store中的数据进行加工处理形成新的数据。 Getter用于对Store中的数据进行加工处理形成新的数据&#xff0c;类似Vue的计算属性。Store中数据发生变化时&#xff0c;Getter中的数据也会随之变化。【getter不会修改store中的原数据&#xff0c;只是对其…

高效能人士的七个习惯 读书笔记1

刚从当当上买了高效能人士的七个习惯&#xff0c;晚上就看了一晚上&#xff0c;发现这本书还是不错的。 这本书也是属于成功学的范畴&#xff0c;但和常见的成功学书籍不同的地方在于&#xff0c;它并不是去讲一些方法、技巧之类的&#xff0c;而是提倡一些原则性的东西&#x…

Python深度学习之安装theano(windows)

前方预警&#xff1a;windows的坑太多了&#xff0c;抛弃用linux吧 安装theano&#xff0c;提前清空自己的python环境吧&#xff0c;坑太多了&#xff0c;anaconda会自动安装path 一&#xff0c;首先安装python包管理anaconda 下载地址&#xff1a;https://repo.continuum.io/a…

Vuex从入门到实战(六)——【实践篇】目标功能阐述 + 常用git指令练习

前面几节已经学习了关于state、mutation、action、getter的基本知识&#xff0c;现在我们应用起来前面学的基础知识来做一个小示例【todos】&#xff1a; 完整代码仓库地址&#xff1a;https://github.com/huijieya/vuex_demo 一、利用vue ui新建项目vuex_demo2 1、次新建步骤…

Vuex从入门到实战(七)——【实践篇】mutation+actions异步请求搞 “活“ 数据

这节来完成模仿带后端的异步请求数据 一、思路及代码 1、main.js挂载store。 2、仔细观察App.vue中是写死的list&#xff0c;而现实开发中是异步请求的。我们先清空list中的数据&#xff1a; 3、list.json——在public文件夹下新建list.json&#xff0c;粘贴json格式化后的…

随机生成数组游戏

1 随机生成数组 封装一个方法generateArray&#xff0c;该方法实现生成指定长度的int数组&#xff0c;该数组的元素为0到指定范围内的随机数&#xff0c;并将该数组返回。 参考答案 首先&#xff0c;分析generateArray方法要实现的功能&#xff0c;该方法要求生成指定长度的数组…

ubuntu gns3 与vbox连接

有时候cisco的有些实验如snmp&#xff0c;tftp等实验需要与操作系统结合 一起。所以&#xff0c;为了搭建这个实验环境我真是费了好多时间。 我使用的系统是ubuntu&#xff0c;需要安装两个必要的组件&#xff1a; apt-get install bridge-utils apt-get install uml-utilities…

Computed property “xxx“ was assigned to but it has no setter.

Computed property “xxx” was assigned to but it has nosetter&#xff1a;计算属性“inputValue”被赋值&#xff0c;但它没有setter。 原因&#xff1a; 组件中v-model“XXX”&#xff0c;而XXX是vuex state中的某个变量vuex中是单项流&#xff0c;v-model是vue中的双向绑…