在文章开始之前,再次强调一句:Vuex会把getter mutations action不管是在模块定义的还是在根级别定义的 都会注册在全局

官网API地址:https://vuex.vuejs.org/zh/guide/actions.html

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。

下面以一个包含异步操作的例子来说明Action的应用场景:

代码目录结构:

actions.js:

import { getAppName } from "@/api/app";

const actions = {
//ES6解构赋值 相当于:updateAppName(paramsObj) {const commit=paramsObj.commit}
// updateAppName({ commit }) { // } /*
*commit: 提交一个 mutation
*state:指代当前store实例的state
*rootState:指代根store实例的state
*dispatch:可以分发actions中的其他方法
*/
updateAppName({ commit, state, rootState, dispatch }) {
getAppName()
.then(res => {
//ES6解构赋值
const { info } = res;
commit("SET_APP_NAME", info);
})
.catch(err => {
console.log(err);
});
} //调用Promise也可以使用ES8的async await 代码更简洁
/*async updateAppName({ commit }) {
try {
const { info } = await getAppName();
commit("SET_APP_NAME", info);
} catch (error) {
console.log(error);
}
}*/
};
export default actions;

app.js:

export const getAppName = () => {
return new Promise((resolve, reject) => {
const err = null;
setTimeout(() => {
if (!err) {
resolve({ code: 200, info: { appName: "WeChat" } });
} else {
reject(err);
}
}, 1000);
});
};

mutations.js:

import vue from 'vue'
const mutations = {
SET_APP_NAME(state, params) {
//若params是对象格式
state.appName = params.appName;
//若params是字符串格式
//state.appName = params;
},
SET_APP_VERSION(state) {
debugger
vue.set(state, 'appVersion', 'v100.0')
//state.appVersion = 'v2.0'
}
}
export default mutations;

store.vue:

<template>
<div>
<a-input :value="inputValue" @input="handlerInput"></a-input>
<p>{{ inputValue }} -> lastLetter is {{ inputValueLastLetter }}</p>
<p>appName: {{ appName }}, appNameWithVersion : {{ appNameWithVersion }}</p>
<p>userName : {{ userName }}, firstLetter is : {{ firstLetter }}</p>
<button @click="handleChangeAppName">修改appName和user.js中的userName</button>
<p>动态给state增加appVersion: {{ appVersion }}</p>
<button @click="handleActionChangeAppName">通过Action修改appName</button>
</div>
</template>
<script>
import AInput from "_c/AInput.vue";
import AShow from "_c/AShow.vue";
//变量的解构赋值
import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
import { stat } from "fs";
export default {
name: "store",
data() {
return {
inputValue: ""
};
},
components: {
AInput: AInput,
AShow: AShow
},
computed: {
//ES6展开操作符 mapState展开会形成一个对象 使用对象展开运算符将此对象混入到外部对象中
...mapState({
appName: state => state.appName,
appVersion: state => state.appVersion,
userName: state => state.user.userName
}),
// 使用对象展开运算符将 getter 混入 computed 对象中
// ...mapGetters(["appNameWithVersion"]),
appNameWithVersion() {
//通过属性访问getters,Getter 会暴露为 store.getters 对象,可以以属性的形式访问这些值:
return this.$store.getters.appNameWithVersion;
},
...mapGetters(["firstLetter"]),
inputValueLastLetter() {
return this.inputValue.substr(-1, 1);
}
},
methods: {
handlerInput(val) {
this.inputValue = val;
},
//
...mapMutations([
"SET_USER_NAME", //将 `this.SET_USER_NAME()` 映射为 `this.$store.commit('SET_USER_NAME')`
"SET_APP_NAME" //将 `this.SET_APP_NAME()` 映射为 `this.$store.commit('SET_APP_NAME')`
]),
...mapActions([
"updateAppName"//将 `this.updateAppName()` 映射为 `this.$store.dispatch('updateAppName')`
]),
handleChangeAppName() {
this.SET_APP_NAME({
appName: "newAppName"
});
this.SET_USER_NAME({
userName: "shuyujie"
});
this.$store.commit("SET_APP_VERSION");
},
handleActionChangeAppName() {
//第一种调用Action的方法
//this.$store.dispatch('updateAppName')
//第二种调用Action的方法
this
.updateAppName();
}
}
};
</script>

效果图:

从图中也可以看出 ,Action 提交的是 mutation,而不是直接变更状态。

最新文章

  1. jquery和Js的区别和基础操作
  2. 【转载】写一个js库需要怎样的知识储备和技术程度?
  3. C#读取ini文件的方法
  4. 烂泥:dnsmasq搭建简易DNS服务器
  5. 基于Solr实现HBase的二级索引
  6. [Js]跟随鼠标移动的div
  7. 【原创】CHROME 最小字体限制为12PX的终极解决方案
  8. iOS中Git的使用
  9. 配置php中的Oracle扩展
  10. linker command failed with exit code 1 (use -v to see invocation),经典Xcode编译错误的出现和解决!
  11. chrome你这是入侵OSX了么?
  12. Asp.Net Web API 2(入门)第一课
  13. web跨域问题
  14. 【翻译】go语言中的map实战
  15. bzoj 2618: [Cqoi2006]凸多边形 [半平面交]
  16. 电脑中安装多个jdk,eclipse的选择!
  17. uCos-II中任务的同步与通信
  18. vscode git设置远程仓库码云
  19. learning gcc args
  20. 零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

热门文章

  1. linux 6 安装 使用 XtraBackup
  2. mybatis 动态行转列
  3. java替换word表格2007
  4. Unity脚本的生命周期 同一脚本/不同脚本/游戏对象激没激活/脚本激没激活,几种情况下的Awake,OnEnable,Start的执行顺序
  5. Murano Weekly Meeting 2015.10.13
  6. [Silverlight][linq to sql]不能找到linq to sql自动生成类型
  7. Linux 安装 webmin
  8. 警告: [SetContextPropertiesRule]{Context} Setting property &#39;source&#39; to &#39;org.eclipse.jst.jee.server:esignmanage&#39; did not find a matching property.解决
  9. 一个position为fixed的div,宽高自适应,怎样让它水平垂直都在窗口居中?
  10. SQL简单语句(增删改查)