我们知道 JS 函数 settimeout 是异步操作 函数,我们尝试用Mutation 执行,然后看看结果:
运行发现 一秒后确实改变为了BiHu ,但打开调试工具发现虽然渲染改变了 ,但是数据 name 还是 'Null' ,截图查看详情:
所以我们总的来说,异步操作别用在Mutation中改变 ,千万千万,原理就是流程图:
但是修改数据唯一的方法就是通过Mutations,那么我们的异步操作就得用action来写了 然后在跳到Mutations去修改,所以看流程图也知道 。
提交actions函数是通过 dispatch ,,例下:
主要代码:
<template>
<div id="app">
<p>Hello {{$store.state.name}}</p>
<button @click="getName">获取姓名</button>
</div>
</template>
<script>
export default {
methods:{
getName(){
this.$store.dispatch('getName')
}
}
}
</script>
<style scoped>
table{
border: 1px black solid;
border-collapse: collapse;
border-spacing: 0;
}
th,td{
padding: 8px 16px;
border: 1px solid black;
text-align: left;
}
th{
background-color: #f7f7f7;
color: black;
font-weight: 600;
}
</style>
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const myVuex = new Vuex.Store({
state:{
name:"Null"
},
mutations:{
getName(state){
state.name = "BiHu" //修改state中name 为 BiHu
}
},
getters:{
},
actions:{
//context:上下文 和store对象具有相同方法和属性的对象.
getName(context){
setTimeout(() => { //异步操作 一秒后改变state中的name为 BiHu
context.commit('getName') //通过Mutations修改state数据
}, 1000);
}
},
modules:{},
});
export default myVuex //导出VUX对象
actions 中的每个方法都有一个上下文context,其次他也是可以携带参数的,和Mutations一样,,,具体下面出代码即可:
<template>
<div id="app">
<p>Hello {{$store.state.name}}</p>
<button @click="getName">获取姓名</button>
</div>
</template>
<script>
export default {
methods:{
getName(){
this.$store.dispatch('getName',()=>{window.alert("我是参数payload 我是一个函数 我成功执行!")}) //这里传递一个函数参数给actions
}
}
}
</script>
<style scoped>
table{
border: 1px black solid;
border-collapse: collapse;
border-spacing: 0;
}
th,td{
padding: 8px 16px;
border: 1px solid black;
text-align: left;
}
th{
background-color: #f7f7f7;
color: black;
font-weight: 600;
}
</style>
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const myVuex = new Vuex.Store({
state:{
name:"Null"
},
mutations:{
getName(state){
state.name = "BiHu" //修改state中name 为 BiHu
}
},
getters:{
},
actions:{
//context:上下文 和store对象具有相同方法和属性的对象.
getName(context,payload){
setTimeout(() => { //异步操作 一秒后改变state中的name为 BiHu
context.commit('getName') //通过Mutations修改state数据
payload() //执行一下函数参数
}, 1000);
}
},
modules:{},
});
export default myVuex //导出VUX对象
这个例子参数传递的是一个函数,,运如下:
就这样,,,,,也可以是 对象风格的 具体自己测试即可。