優勢:經過定義和隔離狀態管理中的各類概念並強制遵照必定的規則,咱們的代碼將會變得更結構化且易維護。使用vuex來引入外部狀態管理,將業務邏輯切分到組件外,能夠避免重複的從服務端抓取數據。html
詳情請參考官網文檔__連接vue
規則:vue-router
1:應用層級的狀態應該集中到單個 store 對象中。vuex
2:提交 mutation 是更改狀態的惟一方法,而且這個過程是同步的npm
3:異步邏輯都應該封裝到 action 裏面app
使用場景1:例如要實如今一個顯示組件中提交表單,另外一個組件的內容須要隨之改變:異步
沒有使用vuex前: (與服務端交互2次)函數
表單組件提交內容時,咱們須要與服務端交互一次(提交);this
顯示組件更新內容時:咱們又須要與服務端交互一次(獲取)。eslint
使用vuex後: (與服務端交互1次)
表單組件提交內容時,咱們在actions中與服務端交互,而後觸發mutation,改變state中的數據狀態;
顯示組件直接使用getters獲取states中的數據。
使用場景2:若是組件只在本地改變數據,不與服務端交互,而且顯示組件也要隨之改變。那不使用vuex是很是難實現的。
沒有使用vuex前:
?
使用vuex後:
觸發mutation,改變state中的數據狀態;
顯示組件直接使用getters獲取states中的數據。
實例1:加減法,實現組件間的值一同變化
文件目錄:
1:編寫app.vue
<template> <div id="app"> <router-view></router-view> <div> count is {{count}} <router-link to="/component1">組件1</router-link> <router-link to="/component2">組件2</router-link> </div> </div> </template> <script> import {mapGetters, mapActions} from 'vuex' export default { name: 'app', computed: mapGetters([ 'count' ]) } </script>
這裏須要知道mapGetters的含義: mapGetters
輔助函數僅僅是將 store 中的 getters 映射到局部計算屬性。 傳送門
2:編寫 component1.vue和 component2.vue。
這兩個組件的內容同樣(組件二中,請改成 組件2 count is,是爲了好區分):
<template> <div class="hello"> 組件1count is {{count}} <button @click="increment">+5</button> <button @click="decrement">-3</button> </div> </template> <script> import {mapGetters, mapActions} from 'vuex' export default { computed: mapGetters([ 'count' ]), methods: mapActions([ 'increment', 'decrement' ]) } </script>
3:router/index.js 路由文件
import Vue from 'vue' import Router from 'vue-router' import component1 from '@/components/component1' import component2 from '@/components/component2' Vue.use(Router) export default new Router({ routes: [ { path: '/component1', name: 'component1', component: component1 }, { path: '/component2', name: 'component2', component: component2 } ] })
4:編寫vuex/index.js
import Vue from 'vue' import Vuex from 'Vuex' import getters from './getters' import actions from './actions' import mutations from './mutations' Vue.use(Vuex) const state = { count: 0 } const store = new Vuex.Store({ state, getters, actions, mutations }) export default store
這裏須要知道state的含義:傳送門
5:編寫vuex/actions.js
const actions = { increment : ({commit}) => commit('increment'), decrement : ({commit}) => commit('decrement') } export default actions
這裏須要知道actions的含義:傳送門
6:編寫vuex/mutaions.js
const mutations = { increment : state =>{ state.count = state.count+5 }, decrement : state =>{ state.count = state.count-3 }, } export default mutations
這裏須要知道mutaions的含義:傳送門
7:編寫vuex/getters.js
const getters = { count: state => state.count } export default getters
這裏須要知道getters的含義:傳送門
8:編寫main.js
import Vue from 'vue' import App from './App' import router from './router' import store from './vuex/index' Vue.config.productionTip = false /* eslint-disable no-new */ new Vue({ el: '#app', router, store, render: h => h(App) })
npm run dev後,啓動項目:
import Vue from 'vue' import Vuex from 'Vuex' Vue.use(Vuex) const state = { candidateEduList: [], relationList: [] } const mutations = { // 設置教育列表 setEduList(state, resData) { state.candidateEduList = resData }, // 設置關係列表 setRelationList(state, resData) { state.relationList = resData } } const store = new Vuex.Store({ state, mutations }) export default { store }
一、組件中直接commit
this.$store.store.commit('setLogin')
帶參數的方式:
this.$store.store.commit('setLogin',data)
二、組價中讀取
this.$store.store.state