Vuex状态集中式管理
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
官方用户指南 https://vuex.vuejs.org/zh/
简单的说,在复杂应用中,Vuex 对vue应用中多个组件的共享状态进行集中式的管理;
这个状态自管理应用包含以下几个部分:
state,驱动应用的数据源;
view,以声明方式将 state 映射到视图;
actions,响应在 view 上的用户输入导致的状态变化。
以下是一个表示“单向数据流”理念的简单示意:
Vuex具体应用流图:
具体通过计数器简单实例来理解:
<template> <div> <p>current Number {{number}} is {{evenOrOdd}}</p> <button @click="increment()">+</button> <button @click="decrement()">-</button> </div> </template> <script> export default { data(){ return { number: 0 } }, methods:{ increment(){ this.number++ }, decrement(){ this.number-- } }, computed:{ evenOrOdd(){ return this.number%2==0 ? '偶数':'奇数' } } } </script> <style scoped> </style>
这个是以前的代码逻辑实现;
现在改用 vuex;
首先安装vuex
npm install --save vuex
store对象编写 store.js
/* vuex的核心管理对象模块:store */ import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state={ number: 1 } const mutations={ incr(state){ state.number++ }, decr(state){ state.number-- } } const actions={ increment({commit}){ // 提交到mutations commit('incr') }, decrement({commit,state}){ if(state.number>0){ // 提交到mutations commit('decr') } } } const getters={ evenOrOdd(state){ return state.number%2==0 ? '偶数':'奇数' } } export default new Vuex.Store({ state, // 状态对象 mutations, // 用来更新state的对象 actions, // 事件对调函数,调用mutations getters // 计算属性函数 })
App.vue
<template> <div> <p>current Number {{$store.state.number}} is {{$store.getters.evenOrOdd}}</p> <button @click="increment()">+</button> <button @click="decrement()">-</button> </div> </template> <script> export default { methods:{ increment(){ // 调用action this.$store.dispatch('increment') }, decrement(){ // 调用action this.$store.dispatch('decrement') } } } </script> <style scoped> </style>
mapState,mapGetters,mapActions简化编写:
<template> <div> <p>current Number {{number}} is {{evenOrOdd}}</p> <button @click="increment">+</button> <button @click="decrement">-</button> </div> </template> <script> import {mapState,mapGetters,mapActions} from 'vuex' export default { computed:{ ...mapState(['number']), ...mapGetters(['evenOrOdd']) }, methods:{ ...mapActions(['increment','decrement']) } } </script> <style scoped> </style>