1.vuex 是一个专门为vue.js应用程序开发的状态管理模式( 一般由 main.js 引入,是全局数据:用于组件间通信的 共享数据)
2. 关键对象
state:存储状态(变量)/ 状态树 (包含所有需要共享的资源)
getters:对数据获取之前的再次编译(简化原始状态数 state),可以理解为state的计算属性 (也可以直接操作 state 搞成一个计算属性 )
mutations:修改状态,并且是同步的。在组件中使用$store.commit('',params)。 (更改 Vuex 的 store 中的状态的唯一方法是提交 mutation)
actions:异步操作。在组件中使用是$store.dispath('') 。 (action 的作用跟mutation的作用是一致的,提交mutation,从而改变state)
actions 类似于 mutation,不同在于:
actions 提交的是 mutation,而不是直接变更状态,actions 可以包含任意异步操作
3. 脚手架环境
vue init webpack app
cd app
npm install vuex --save
npm run dev
src目录下创建一个vuex文件夹,vuex文件夹下新建一个store.js文件
4. 关键代码
入口文件 main.js
import Vue from 'vue' import App from './App' import router from './router' import store from './vuex/store' // 引入store Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, store, components: { App }, template: '<App/>' })
状态管理配置文件 store.js (当代码量大时,可以分别写个.js文件再引入,如 state.js)
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state = { count: 0 } const mutations = { mutationsAddCount:(state, n = 0) => { return state.count += n }, mutationsReduceCount(state, n = 0) { return (state.count -= n) } } const actions = { actionsAddCount(context, n = 0) { console.log(context) return context.commit('mutationsAddCount', n) }, actionsReduceCount({ commit }, n = 0) { return commit('mutationsReduceCount', n) } } const getters = { getterCount(state) { return state.count } } export default new Vuex.Store({ state, mutations, actions, getters })
实例组件 HelloWorld.vue
<template> <div class="hello"> <h3>{{$store.state.count}}</h3> <div> <button @click="handleAddClick(10)">增加</button> <button @click="handleReduceClick(10)">减少</button> </div> <div>异步操作</div> <div> <button @click="handleActionsAdd(20)">异步增加</button> <button @click="handleActionsReduce(20)">异步减少</button> </div> <h4>{{myCount}}</h4> </div> </template> <script> export default { methods: { handleAddClick(n) { this.$store.commit("mutationsAddCount", n); }, handleReduceClick(n) { this.$store.commit("mutationsReduceCount", n); }, handleActionsAdd(n) { this.$store.dispatch("actionsAddCount", n); }, handleActionsReduce(n) { this.$store.dispatch("actionsReduceCount", n); } }, computed: { myCount() { return this.$store.getters.getterCount+10; } } }; </script> <style> </style>
4.1 import { mapState, mapMutations, mapActions, mapGetters } from "vuex"; 版本
HelloWorld.vue
<template> <div class="hello"> <h3>{{mapCount}}</h3> <div> <button @click="handleAddClick(10)">增加</button> <button @click="handleReduceClick(10)">减少</button> </div> <div>异步操作</div> <div> <button @click="handleActionsAdd(20)">异步增加</button> <button @click="handleActionsReduce(20)">异步减少</button> </div> <h4>{{getterCount}}</h4> </div> </template> <script> import { mapState, mapMutations, mapActions, mapGetters } from "vuex"; export default { methods: { ...mapMutations({ handleAddClick: "mutationsAddCount", handleReduceClick: "mutationsReduceCount" }), ...mapActions({ handleActionsAdd: "actionsAddCount", handleActionsReduce: "actionsReduceCount" }) }, computed: { //获取store里面的state值到本地 ...mapState({ mapCount: state => state.count }), //获取store中的getter值 // ...mapGetters({ // getterCount: 'getterCount' // }) ...mapGetters(['getterCount']) } }; </script> <style> </style>
5. 参考链接