actions 和 mutations的本质区别
为什么actions 做异步处理
// src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
// import Vuex from '@/vuex'
// 会默认调用 Vuex 的 install 方法
// Vue.use方法的简单实现
// Vue.use = function(plugin, options) {
// plugin.install(Vue, options)
// }
Vue.use(Vuex)
// Vuex是一个对象,里面有一个大写的Store和install方法
export default new Vuex.Store({
state: {
count: 1,
// 注意,如果state中的属性和模块同名,后面的会覆盖前面的,导致无法取到这个值
a: 'a'
},
getters: {
getCount(state) {
return state.count + 1
}
},
mutations: {
changeCount(state, payload) {
state.count += payload
}
},
actions: {
changeCount({ commit }, payload) {
setTimeout(() => {
commit('changeCount', payload)
}, 1000)
}
},
modules: {
a: {
namespaced: true,
state: {
name: 'f',
count: 18
},
mutations: {
changeCount(state, payload) {
state.count += payload
}
}
},
b: {
namespaced: true,
state: {
name: 'g',
count: 17
},
mutations: {
changeCount(state, payload) {
state.count += payload
}
}
}
}
})
// src/App.vue
<template>
<div id="app">
<div>
count:{{$store.state.count}}
</div>
<!-- getters里面的未发生变化的情况下,多次调用getters里面的值,只需执行一次,节省性能 -->
<div>
gettter:{{$store.getters.getCount}}
</div>
<div>
gettter:{{$store.getters.getCount}}
</div>
<div>
gettter:{{$store.getters.getCount}}
</div>
<button @click="$store.state.count = 10">不合规改变state</button>
<!-- 不要直接修改state的值,因为一个state的值可能被多个组件使用,如果在某个组件里直接修改这个state的值,会影响到其他组件,不利于查找数据的改变来源。 -->
<button @click="$store.state.count = 10">不合规改变state</button>
<button @click="$store.commit('changeCount', 10)">同步加{{$store.state.count}}</button>
<button @click="$store.dispatch('changeCount', 100)">异步加{{$store.state.count}}</button>
<!-- 模块中没有对mutations进行划分,导致修改上面的mutations值,模块中的值也会发生变化,这个问题需要给模块设置 namespaced: true 来避免 -->
<div>
<!-- a/changeCount 调用a模块下的changeCount -->
<button @click="$store.commit('a/changeCount', 10)">a模块count同步加{{$store.state.a.count}}</button>
a模块中name的值{{$store.state.a.name}} count:{{$store.state.b.count}}
</div>
<div>
<button @click="$store.commit('b/changeCount', 10)">b模块count同步加{{$store.state.b.count}}</button>
b模块中name的值{{$store.state.b.name}} count:{{$store.state.b.count}}
</div>
</div>
</template>
<script>
export default {
mounted() {
console.log(this.$store)
}
}
</script>