该节教程代码可经过npm start运行devServer,在http://localhost:8080/查看效果css
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的全部组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。html
Vuex具备如下特色:vue
Vuex解决了哪些问题:git
代码示例:/lesson20/src/main.jsgithub
先使用vue-cli建立一个项目,以后使用npm install vuex --save安装Vuex,就能够在/src/main.js中配置Vuex:vuex
// 1. vuex-引入
import Vuex from 'vuex'
// vue-cli自带的编译配置
Vue.config.productionTip = false
// 1. vuex-在Vue中使用Vuex,让Vuex中的操做挂载到Vue中。
Vue.use(Vuex)
// 3. vuex-声明store对象
const store = new Vuex.Store({
strict: process.env.NODE_ENV !== 'production', // 严格模式:防止直接修改state,只能用Mutations操做,因为strict模式是经过对象深度匹配进行,生产模式打开会严重影响性能。
state: {a: 12, b: 5}, // 核心:数据
mutations: { // 定义Mutations
},
actions: { // 定义actions
},
getters: {}, // 相似于computed
modules: {} // 将store拆分红多个命名空间,分开使用。
})
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store, // 将store挂载到Vue实例中。
components: { App },
template: '<App/>'
})
复制代码
代码示例:/src/components/Index.vuevue-cli
在Index.vue中能够经过$store.state.a读取到已定义的a的值。npm
<template>
<div>
<!-- 读取Vuex的state -->
a: {{$store.state.a}}
<Cmp1/>
<Table :fields="fields" :datas="datas" :parent="this"/>
</div>
</template>
复制代码
接下来实如今Cmp1.vue组件中,点击按钮后修改state中的a的值。bash
代码示例:/src/components/Cmp1.vueapp
<template lang="html">
<div class="">
<input type="button" value="+5" @click="fn()">
</div>
</template>
<script>
export default {
name: 'cmp1',
methods: {
fn(){
// this.$store.state.a+=5; // 在严格模式下,直接修改state能够成功,但会报错
// this.$store.commit('add', 5); // 直接触发一个Mutation其实也可行,且不会报错,但这其实违背了Vuex设计的初衷。
this.$store.dispatch('add', 5); // 触发一个action,实现数据修改。
}
}
}
</script>
<style lang="css" scoped>
</style>
复制代码
在main.js中定义Actions和Mutations。
代码示例:/lesson20/src/main.js
const store = new Vuex.Store({
strict: process.env.NODE_ENV !== 'production', // 严格模式:防止直接修改state,只能用Mutations操做,因为strict模式是经过对象深度匹配进行,生产模式打开会严重影响性能。
state: {a: 12, b: 5}, // 核心:数据
mutations: { // 定义Mutations,经过action触发并更新state,Vue Devtool能够监听到数据的修改状况。
add (state, n) { // 第一个参数为旧state,第二个参数为action中commit传入的参数。
state.a += n
}
},
actions: { // 定义actions,actions被触发后,将数据提交给Mutations进行处理并更新state。
add ({ commit }, n) { // 第一个参数为context对象,它不是store自己,能够经过context.commit提交一个Mutation。第二个参数为用于更新state的参数。
commit('add', n)
}
},
getters: {}, // 相似于computed
modules: {} // 将store拆分红多个命名空间,分开使用。
})
复制代码