Vuex基础-Action
2024-10-21 06:48:11
在文章开始之前,再次强调一句: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,而不是直接变更状态。
最新文章
- jquery和Js的区别和基础操作
- 【转载】写一个js库需要怎样的知识储备和技术程度?
- C#读取ini文件的方法
- 烂泥:dnsmasq搭建简易DNS服务器
- 基于Solr实现HBase的二级索引
- [Js]跟随鼠标移动的div
- 【原创】CHROME 最小字体限制为12PX的终极解决方案
- iOS中Git的使用
- 配置php中的Oracle扩展
- linker command failed with exit code 1 (use -v to see invocation),经典Xcode编译错误的出现和解决!
- chrome你这是入侵OSX了么?
- Asp.Net Web API 2(入门)第一课
- web跨域问题
- 【翻译】go语言中的map实战
- bzoj 2618: [Cqoi2006]凸多边形 [半平面交]
- 电脑中安装多个jdk,eclipse的选择!
- uCos-II中任务的同步与通信
- vscode git设置远程仓库码云
- learning gcc args
- 零基础入门到精通:Python大数据与机器学习之Pandas-数据操作
热门文章
- linux 6 安装 使用 XtraBackup
- mybatis 动态行转列
- java替换word表格2007
- Unity脚本的生命周期 同一脚本/不同脚本/游戏对象激没激活/脚本激没激活,几种情况下的Awake,OnEnable,Start的执行顺序
- Murano Weekly Meeting 2015.10.13
- [Silverlight][linq to sql]不能找到linq to sql自动生成类型
- Linux 安装 webmin
- 警告: [SetContextPropertiesRule]{Context} Setting property &#39;source&#39; to &#39;org.eclipse.jst.jee.server:esignmanage&#39; did not find a matching property.解决
- 一个position为fixed的div,宽高自适应,怎样让它水平垂直都在窗口居中?
- SQL简单语句(增删改查)