Vuex是什么,我的理解是vue.js中集中管理状态的一种模式。官网解释:Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的全部组件的状态并以相应的规则保证状态以一种可预测的方式发生变化。vue
若是构建的应用比较简单,没有必要使用vuex,简单的单向数据流就能知足产品需求,体现单向数据流的简洁性,以下:vuex
<template> <div>{{count}}</div> <el-button @click="increment ">count</el-button> </template>
new Vue({ data () { return { count: 0 } }, methods: { increment () { this.count++ } } })
适用场景:npm
若是应用是小型的、组件很少、组件之间的状态依赖很少、结构清晰便于维护,组件之间不多有数据之间的关联,这样的状况,不必使用vuex。
相反,哪些比较大型的应用,多个视图组件共用一个状态,一个组件的修改,须要更新其它关联的组件,此时Vuex比较适用。相似商城系统、外卖系统等。app
Vuex的使用:
安装vuex,在项目中执行命令:npm install vuex --save-dev 或者使用淘宝镜像 cnpm install vuex --save-devthis
建立文件&&书写代码部分:spa
一、建立文件夹store,而后在里面建立文件store.js,并引入相关文件:eslint
import Vue from 'vue' import Vuex from 'vuex' import getters from './getters' import * as actions from './actions' import mutations from './mutations' import state from './state' Vue.use(Vuex) // 注册上面引入的各大模块 const store = new Vuex.Store({ state, getters, actions, mutations, state }) export default store// 导出store并在 main.js中引用注册。
二、建立文件state.js,代码以下:code
const state = { count: 0, countNumber: 10 } export default state
三、建立文件actions.js,代码以下:component
export function count ({commit}, name) { return commit('count', name) // 触发mutations中的方法&&传值 }
四、建立文件getters.js。(个人理解是store的计算属性)router
const getters = { countNumber (state) { state.countNumber+=2 // state中countNumber字段发生变化,就会触发该方法 return state.countNumber } }
五、建立文件mutations.js,代码以下:
const mutations = { count (state, num) { // num为dispatch传递的参数 state.count+=num state.countNumber+=num } } export default mutations
六、main.js文件,须要引入store:
import Vue from 'vue' import App from './App' import router from './router' import store from './store/store.js' // 导入文件store Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, store, components: { App }, template: '<App/>' })
七、文件HelloWorld.vue中的相关操做:
<template> <div class="hello"> <div class="addClsFather"> <div class="addCls" @click="addFuc"> Add </div> <div> 未使用vuex:{{count}} </div> <div> 使用vuex:{{this.$store.state.count}} </div> <div> 计算属性getters:{{countNumber}} ¥ </div> </div> </div> </template> <script> import { mapGetters } from 'vuex' export default { name: 'HelloWorld', data () { return { count: 0 } }, computed: mapGetters([ 'countNumber' ]), methods: { addFuc() { this.count++ this.$store.dispatch('count', 5) // 触发action中的方法&&传值 } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> .addClsFather { margin: 50px 100px; } .addCls { cursor: pointer; width: 100px; height: 30px; line-height: 30px; background-color: blue; text-align: center; color: #fff; border-radius: 5px; } </style>
总体思路:
一、在文件HelloWorld.vue中,点击"Add"按钮,经过dispatch触发action并传值;
二、在action中,触发mutations中的方法并传值;
三、经过mutations改变state中的字段值;
四、对于使用了getters的字段,在state中的该字段改变后,会触发getters,并进行相关的处理(getters能够理解为state的计算属性);
五、state、getters改变后,渲染到DOM中。
注:在使用getters的字段,须要在相关关的(HelloWorld.vue)页面引入mapGetters字段,并添加computed属性,以下(不使用computed属性,不会起做用):
computed: mapGetters([ 'countNumber' ]),