Vuex是一个专为Vue.js应用开发的状态管理模式,集中式存储管理应用所有组件的状态。
Vuex遵循“单向数据流”理念,易于问题追踪以及提高代码可维护性。
Vue中多个视图依赖于同一状态时,视图间传参和状态同步比较困难,Vuex能够很好解决该问题。
actions:做一些业务逻辑,比如异步操作,处理复杂的业务逻辑,类似于controller
getters: 派生状态用法,根据当前状态计算其他值,计算属性
mutations只修改状态,修改状态只能通过mutations修改
actions处理复杂业务逻辑,修改状态还得是mutations
state保存数据状态,mutations用于修改状态,
//store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ // 状态 state: { count: 0 }, //改状态的函数 mutations: { add(state,num = 1){ state.count += num; } }, //派生状态函数 getters: { //根据当前状态计算其他值,派生用法 score(state){ return 'score:' + state.count } }, //做复杂业务逻辑,异步操作,比如ajax请求 类似于controllers //业务场景:1、异步请求 2、同时修改多个状态(外围只要dispatch一次就好了) actions: { // {commit,state,getters} 解构上下文参数,后边num跟通知的参数 asyncAdd({commit,state,getters},num = 1){ //1.只修改状态 // setTimeout(()=>{ // commit('add', num) // },1000) //1.修改状态 2.通知外围调用者去做其他操作 return new Promise((resolve,reject)=>{ //模拟异步操作,执行成功通知修改状态 且通知外围的调用者去做一些其他的操作 setTimeout(()=>{ commit('add', num) //成功 resolve({ok:1}) //失败 // reject({ok:0}) },1000) }) } } }) //main.js import Vue from 'vue' import App from './App' import store from './store.js' Vue.config.productionTip = false Vue.use(store) new Vue({ el: '#app', store, components: { App }, template: '<App/>' }) //VuexTest.vue <template> <div> <h3>vuex test</h3> <!-- 基本用法 --> <p>{{$store.state.count}}</p> <!-- getters:派生状态(计算属性) --> <p>{{$store.getters.score}}</p> <!-- mutations:修改状态 --> <button @click="add">add</button> <!-- actions:异步操作 --> <button @click="asyncAdd">asyncAdd写法1</button> <button @click="asyncAdd2">asyncAdd写法2</button> </div> </template> <script> export default { methods: { add() { //单向数据流 不建议这样修改 // this.$store.state.count += 1 //mutations修改值状态 commit this.$store.commit('add',2); }, //Promise返回写法 asyncAdd(){ //actions修改值状态 dispatch this.$store.dispatch('asyncAdd', 3).then((result)=>{ if(result.ok === 1){ //路由跳转。。 alert('操作成功') } }).catch(()=>{ alert('操作失败') }); }, //async 结合 await写法 async asyncAdd2(){ //actions修改值状态 dispatch const result = await this.$store.dispatch('asyncAdd', 3); if(result.ok === 1){ //路由跳转。。 alert('操作成功') }else{ alert('操作失败') } } } } </script> <style> </style>