关于 mutations与actions的区别,网上有很多文章,大多是照着vue.js的教程再来一波!!因为最近接手vue项目,自己之前vue的知识点掌握也不深,就此机会把这个知识点再深挖一下。

使用vuex进行状态管理时,使用mutations来进行state的状态变更。其中一个要求就是mutations中的代码必需时同步的,因此要想在其中包含异步操作是不合适的。如下代码:

const app = {
state: {
//直接访问state中的元素,可获得元素的值,但是不利于封装
//并且在访问是如果store.count的访问方式也不方便
//mapStore方便快速将store.count映射到计算属性,但本质上还是直接访问元素的值,无法达到getters封装取值时二次加工的效果
count: 100
},
getters: {
//对state元素进行取值进行封装,可以方便实现在取值时的各种运算需求
//mapGetters与mapState类型,实现快速将getters映射到计算属性
getCount: state => {
return state.count > 100 ? true : false
}
},
mutations: {
//对state元素值的写入进行封装,可以方便实现在赋值时的各种运算需求
//mapMutations与mapState类型,实现快速将mutations映射到方法中methods
add(state, n) {
state.count += n
}
}
}
export default app

如上面的add中要根据n的奇偶性来异步request不同外部接口获取数据用于运算,此时mutation中就导致无法完成操作。因此在没有actions的概念下,我们只能将(根据n的奇偶性来异步request不同外部接口获取数据)其提前与add执行,然后将执行结果传给add来实现该目的。但这么做的结果是逻辑被拆开,逻辑松散化了。个人认为这就是mutations的短板,为了能将该短板补上,actions就横空出世了。

action中则可以按上面的逻辑执行,并最终提交的mutation add,瞬间海阔天空了!

//基础store配置信息
import Vue from 'vue' const app = {
state: {
//直接访问state中的元素,可获得元素的值,但是不利于封装
//并且在访问是如果store.count的访问方式也不方便
//mapStore方便快速将store.count映射到计算属性,但本质上还是直接访问元素的值,无法达到getters封装取值时二次加工的效果
count: 100
},
getters: {
//对state元素进行取值进行封装,可以方便实现在取值时的各种运算需求
//mapGetters与mapState类型,实现快速将getters映射到计算属性
getCount: state => {
return state.count > 100 ? true : false
}
},
mutations: {
//对state元素值的写入进行封装,可以方便实现在赋值时的各种运算需求
//mapMutations与mapState类型,实现快速将mutations映射到方法中methods
add(state, n) {
state.count += n
}
},
actions:{
aadd({commit},n){
if(n%2){
Vue.axios.get('http://127.0.0.1:8881/home/a').then(res=>{
console.log(res.data)
commit('add',res.data)
})
}
else{
Vue.axios.post('http://127.0.0.1:8881/home/b').then(res=>{
console.log(res.data)
commit('add',res.data)
})
}
}
}
}
export default app

这个就能在actions中顺利的执行ajax异步操作了,nice!

完整代码:

//main.js
import Vue from 'vue'
import App from './App.vue'
import Vuex from 'vuex'
import axios from 'axios'
import VueAxios from 'vue-axios'
import storeSetting from './strore' Vue.use(Vuex)
Vue.use(VueAxios, axios) const store = new Vuex.Store(storeSetting) new Vue({
store,
render: h => h(App),
}).$mount('#app')
// /store/index.js,基础store配置信息
//引入vue,方便调用axios
import Vue from 'vue' const app = {
state: {
count: 100
},
getters: {
getCount: state => {
return state.count > 100 ? true : false
}
},
mutations: {
add(state, n) {
state.count += n
}
},
actions:{
aadd({commit},n){
if(n%2){
Vue.axios.get('http://127.0.0.1:8881/home/a').then(res=>{
console.log(res.data)
commit('add',res.data)
})
}
else{
Vue.axios.post('http://127.0.0.1:8881/home/b').then(res=>{
console.log(res.data)
commit('add',res.data)
})
}
}
}
}
export default app
<template>
<div id="app">
<p><button @click="add">count</button></p>
</div>
</template> <script>
import setting from "./components/routes/nameview/Setting.vue";
import { mapState } from "vuex"; export default {
components: { setting },
name: "App",
methods: {
add(){
this.$store.dispatch('aadd',2)
}
}
};
</script>

vue mutations与actions的区别的更多相关文章

  1. vuex中mutations与actions的区别

    要执行vuex中的函数,有两种方法: 1.commit,例如this.$store.commit("GETMODULESELECTLIST"); //mutations中的方法 2 ...

  2. Vuex入门实践(中)-多module中的state、mutations、actions和getters

    一.前言 上一篇文章<Vuex入门实践(上)>,我们一共实践了vuex的这些内容: 1.在state中定义共享属性,在组件中可使用[$store.state.属性名]访问共享属性 2.在m ...

  3. vue和react之间的区别

    1.Vue和React之间的区别 相同点: Vue和其他框架一样,都有组件开发和虚拟dom 都支持props进行父子组件之间的数据通信 都支持数据驱动视图,不直接操作真实dom 都支持服务器端的 渲染 ...

  4. vue 中 watch 和 watchEffect 区别

    vue 中 watch 和 watchEffect 区别 * watch 需要先指明需要侦听的数据源,watchEffect 不需要,只要传入的函数带有依赖就会自动追踪. * watchEffect ...

  5. vue、React Nactive的区别(转载)

    Vue与React的对比 Vue.js与React.js从某些反面来说很相似,通过两个框架的学习,有时候对一些用法会有一点思考,为加深学习的思索,特翻阅了两个文档,从以下各方面进行了对比,加深了对这两 ...

  6. vuex中的state、mutations 、actions 、getters四大属性如何使用

    一.state (提供唯一的公共数据源) 方式1 在div中,$store.state.count 方式2 import {mapState} from 'vuex' computed:{ -mapS ...

  7. vue $mount 和 el的区别

    两者在使用效果上没有任何区别,都是为了将实例化后的vue挂载到指定的dom元素中. 如果在实例化vue的时候指定el,则该vue将会渲染在此el对应的dom中,反之,若没有指定el,则vue实例会处于 ...

  8. vue中$mount与el区别

    vue中的$mount和el两者在使用中没有什么区别,都是将实例化后的vue挂载到指定的DOM元素中 用法: 如果在实例化vue时指定el,则该vue将会渲染在el对应的DOM中 反之 没有指定el, ...

  9. Vue路由钩子 afterEach beforeEach区别

    ​ vue-router作为vue里面最基础的服务,学习一段时间,对遇到的需求进行一些总结 使用vue-cli作为开发前提 vue-router已经配置好了 路由写法 routes: [ { path ...

  10. Vue 中computed 与 methods 区别

    1.示例 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF- ...

随机推荐

  1. springboot下添加日志模块和设置日志文件输出

    前言 日志的使用将通过SLF4J来使用,SLF4J(Simple Logging Facade for Java)是一个为Java应用提供简单日志记录的接口.它的主要目标是在不同的日志系统之间提供一个 ...

  2. 【UniApp】-uni-app-传递数据

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-路由 那么了解完了uni-app-路由之后,这篇文章来给大家介绍一下 uni-app-路由传递数据 路由传参怎么传,是不是可以从 A ...

  3. Java反射,看完就会用

    什么是反射 在说反射概念之前,我们先说另外2个概念:编译期和运行期. 编译期: 编译期是源代码从文本形式转换为字节码的过程,这发生在Java代码被JVM执行之前. 在编译期,编译器对源代码进行语法检查 ...

  4. 正则表达式之grep与sed用法

    一.grep和egrep的用法 (一)grep用法 grep是根据给出的条件查找特定的字符.用单引号查找指定的单词,图1.1.grep后面可选项用**-n显示查找的行数:-i不区分大小写查找图1.2 ...

  5. C#汉诺塔递归算法实现

    目录: 一.什么是递归 1.先来看一下一个递归的例子 2.递归的基本原理 二.汉诺塔问题 1.汉诺塔的故事 2.回到编程,汉诺塔问题主要就是解决这个问题: 3.怎么解决汉诺塔问题 要解决汉诺塔问题就要 ...

  6. PowerDotNet平台化软件架构设计与实现系列(17):PCRM个人用户管理平台

    个人用户管理是业务系统中非常基础且重要的一个公共服务系统,我们写的绝大多数应用都和个人用户或会员有关,用户(会员)数据安全无小事,必须有一个完备的用户管理平台系统. 因为不同公司的主业务不同,个人用户 ...

  7. 网络地图服务(WMS)详解

    目录 1.概述 2.GetCapabilities 3.GetMap 4.GetFeatureInfo 阅读本文之前可参考前文:<地图服务器GeoServer的安装与配置>与<Geo ...

  8. 爬取Discuz!社区的教程标题

    爬取Discuz!社区的教程标题-史上最详细解析(实现分页) 摘要:本文记录了爬取Discuz!社区的教程标题的详细过程,过程清晰 这是O的第一篇博客,如有排版问题请大佬见谅,O非常希望大佬能在评论区 ...

  9. row_number函数的不稳定性

    本文分享自华为云社区<row_number函数的不稳定性>,作者: nullptr_ . row_number为窗口函数,用来为各组内数据生成连续排号 基础用法 postgres=# se ...

  10. 华为云张昆:支持全场景全业务,GaussDB加速企业数字化转型

    云.AI.5G等技术驱动,数据库行业迎来新的需求,云数据库也在不断演进升级.依托华为云与华为云Stack,通过全栈软硬件优化,华为云GaussDB进行了进阶与革新,以统一的架构,支持关系型与非关系型的 ...