- Vuex的基本原理
三个主要属性:
State:状态数据,保存了可供所有组件公用的数据,严格模式下只可由mutation触发改变
Mutations:定义了一些列方法,用于同步修改state保存的数据,提供了一个默认参数state
Actions:定义了一系列方法,用于异步触发mutation,间接修改state保存的数据,有一个默认参数commit,触发mutation的函数
两个重要方法:
dispatch:触发action的函数,写法:this.$store.dispatch('action方法名',参数)
commit:触发mutation的函数,写法:this.$store.commit('mutations方法名',参数)
总结:state保存的变量,mutation通过一系列的计算,马上更新这些变量;action里封装一些异步操作,完了触发commit进而改变state保存的变量。
2. 一个基本的例子
1)首先用vue-cli创建一个带vuex(store)的基本工程
2)在store/index.js中定义一个基本的Store对象:
import Vuex from 'vuex'
import Vue from 'vue'
import returnCount from '../api/returnCount'
Vue.use(Vuex)
export default new Vuex.Store({
state:{
count:0
},
mutations:{
mutateCount:(state,count1)=>{
state.count+=count1
}
},
actions:{
actionCount:async({commit},param)=>{
let newCount=await returnCount()
console.log('异步获取后台数据', newCount)
commit('mutateCount',param*newCount)
}
},
// getters:{
// }
})3)在App.vue中定义一个按钮,绑定一个鼠标点击书简changeCount(),并在其中用{{ this.$store.state.count }}显示state保存的count变量:
<template>
<div id="app">
{{ this.$store.state.count }}
<button @click="changeCount">改变count</button>
</div>
</template>
<script>
export default {
name: 'App',
methods:{
changeCount(param){
this.$store.dispatch('actionCount',param)
}
}
}
</script>
...其中按钮事件changeCount触发了一个actionCount方法,传递了一个参数10,action方法中使用async/await函数异步调用了写的一个模拟后台数据生成的api(src/api/returnCount):
export default function returnCount(){
return new Promise((resolve,reject)=>{
console.log('后台生成数据中')
setTimeout(()=>{
resolve(5)
},3000)
})
}这个异步操作是一个Promise对象,用于3秒后返回一个数字10
await等到获取到这个数字5,将其传给mutateCount方法,然后利用commit触发mutateCount,mutateCount方法直接改变count的值。
控制台输出结果:
点击按钮触发action,并传递一个参数“10”,action打印“后台数据生成中”,等3s后拿到后台数据5,计算得到一个新参数“50”,通过commit触发mutation,更新state的count为“50”

京公网安备 11010502036488号