1. 借鉴 了Flux、Redux、 The Elm Architecturejavascript
2. 专为 Vue.js 设计 的状态管理模式html
3. 集中式存储和管理应用程序中全部组件的状态前端
4. Vuex 也集成到 Vue 的官方调试工具vue
5. 一个 Vuex 应用的核心是 store(仓库,一个容器),store包含着你的应用中大部分的状态 (state)。java
传参的方法对于多层嵌套的组件将会很是繁琐,而且对于兄弟组件间的状态传递无能为力node
采用父子组件直接引用或者经过事件来变动和同步状态的多份拷贝,一般会致使没法维护的代码git
当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地获得高效更新。es6
改变 store 中的状态的惟一途径就是显式地提交 (commit) mutation,方便咱们跟踪每个状态的变化。github
* vue cli 3 中搭建脚手架预设时选择了“vuex”后便安装了vuex,可跳过此步阅读vuex
在 Vue 以后引入 vuex
会进行自动安装:
<script src="/path/to/vue.js"></script> <script src="/path/to/vuex.js"></script>
npm install vuex --save //yarn add vuex
在一个模块化的打包系统中,您必须显式地经过 Vue.use() 来安装 Vuex:
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex)
git clone https://github.com/vuejs/vuex.git node_modules/vuex cd node_modules/vuex npm install npm run build
Vuex 依赖 Promise。若是你支持的浏览器并无实现 Promise (如 IE),那么你可使用一个 polyfill 的库(如 es6-promis)
window.Promise
会自动可用:<script src="https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.js"></script>
npm install es6-promise --save //yarn add es6-promise
而后,将下列代码添加到你使用 Vuex 以前的一个地方:
import 'es6-promise/auto'
import Vue from 'vue'//引入vue import Vuex from 'vuex'//引入vuex Vue.use(Vuex); //使用 vuex
import store from './store' //引入状态管理 store
ps. 你能够像上面那样将“属性和值”直接写在实例中,当代码量大时,你也能够分别写个.js文件,以下图:
而后引入到 store/index.js 注册到vuex实例中,如:
import {mapActions, mapState,mapGetters} from 'vuex' //注册 action 、 state 、getter
使用方法有不少,这种事最简单实用的,更多能够查看官网学习:https://vuex.vuejs.org/zh/
来个简单易懂的计数
eg:store.js
import Vue from 'vue'; import Vuex from 'vuex'; //引入 vuex import store from './store' //注册store Vue.use(Vuex); //使用 vuex export default new Vuex.Store({ state: { // 初始化状态 count: 0, someLists:[] }, mutations: { // 处理状态 increment(state, payload) { state.count += payload.step || 1; } }, actions: { // 提交改变后的状态 increment(context, param) { context.state.count += param.step; context.commit('increment', context.state.count)//提交改变后的state.count值 }, incrementStep({state, commit, rootState}) { if (rootState.count < 100) { store.dispatch('increment', {//调用increment()方法 step: 10 }) } } }, getters: { //处理列表项 someLists: state =>param=> { return state.someLists.filter(() => param.done) } } })
使用时,eg:
main.js:
import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' //引入状态管理 store Vue.config.productionTip = false new Vue({ router, store,//注册store(这能够把 store 的实例注入全部的子组件) render: h => h(App) }).$mount('#app')
views/home.vue:
<template> <div class="home"> <!--在前端HTML页面中使用 count--> <HelloWorld :msg="count"/> <!--表单处理 双向绑定 count--> <input :value="count" @input="incrementStep"> </div> </template> <script> import HelloWorld from '@/components/HelloWorld.vue' import {mapActions, mapState,mapGetters} from 'vuex' //注册 action 和 state export default { name: 'home', computed: { //在这里映射 store.state.count,使用方法和 computed 里的其余属性同样 ...mapState([ 'count' ]), count () { return store.state.count } }, created() { this.incrementStep(); }, methods: { //在这里引入 action 里的方法,使用方法和 methods 里的其余方法同样 ...mapActions([ 'incrementStep' ]), // 使用对象展开运算符将 getter 混入 computed 对象中 ...mapGetters([ 'someLists' // ... ]) }, components: { HelloWorld } } </script>
运行结果: