1.Vuex 是一個專爲 Vue.js 應用程序開發的狀態管理模式。簡單直白的理解:至關於全局變量,但和全局變量又有兩點不一樣。vue
(1)Vuex 的狀態存儲是響應式的。當 Vue 組件從 store 中讀取狀態的時,若 store 中的狀態變化,那麼相應的組件也更新。 (2)不能直接改變 store 中的狀態。改變 store 中的狀態的惟一途徑就是顯式地提交(commit) mutations。2.中大型項目使用能很好解決組件間混亂的多層級數據傳遞通訊問題。webpack
State
池 (數據源)Getter
查 (獲取數據源的數據,至關於vue的computed)Mutation
修改 (真正修改的動做 同步)Action
觸發修改行爲(多配合異步使用)Module
能夠擁有多個數據源(數據池)git
# 選webpack模板 搭建在一個叫pro_vuex的文件夾裏 $ vue init webpack pro_vuex
# 進入項目安裝並保存到依賴上 $ npm i vuex -S
. ├── App.vue //父組件 ├── main.js //入口文件 ├── `store ` //狀態管理文件夾 | ├── modules //多個數據源(數據池) │ └── `index.js` ├── components │ └── HelloWorld.vue //子組件 ├── router //路由 │ └── index.js └── assets └── logo.png
建立倉庫 /store/index.js
import引入插件;Vue.use使用插件;new Vuex.Store 實例化一個Vuex對象;暴露出去github
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); // 實例化Vuex,建立一個倉庫 const store = new Vuex.Store({ // 數據池 state: { count: 0, author: 'tom' }, // 能夠對數據操做後返回 至關於vue裏面的computed getters:{ userName(state){ return state.author +' hello'; } }, // 修改數據的方法 同步 mutations: { // 修改數據的方法。 參數一固定state 後面隨意 increment(state,num) { state.count+=num } }, // 修改數據的異步 方法 actions:{ // 參數一 執行上下文 incrementAction(context,num) { context.commit("increment",num); //等同於在組件裏面this.$store.commit("increment",18) } } }) // 暴露出去 export default store
入口文件引入倉庫 main.js
單頁面應用程序中 在入口文件引用,其下子組件就全都能獲取調用。web
import Vue from 'vue' import App from './App' import router from './router' import store from './store/index.js' // 引入倉庫 Vue.config.productionTip = false new Vue({ el: '#app', router, store, // 掛載倉庫 key和value同樣時 能夠簡寫 components: { App }, template: `<App/>` })
任意組件讀取修改倉庫 示例在components/HelloWorld.vuevuex
<template> <div class="hello"> <h1>{{ msg }}</h1> <h4>年齡: {{my_age}} </h4> <h4>用戶名:{{name}} </h4> <h4>打招呼:{{userName}}</h4> <input type="button" @click="add_mutation" value="mutation方法修改年齡my_age"> <br/>~~~~ <input type="button" @click="add_action" value="action方法修改年齡my_age"> </div> </template> <script> export default { name: 'HelloWorld', data () { return { msg: '來自子組件的親切問候' } }, computed:{ my_age(){ return this.$store.state.count }, name(){ return this.$store.state.author }, userName(){ return this.$store.getters.userName; //經過getters方法的 讀取也要區分處理 } }, methods:{ add_mutation(){ this.$store.commit("increment",18) //調用store/index.js裏面經過mutations定義的increment方法 }, add_action(){ this.$store.dispatch("incrementAction",12); } } } </script> <style scoped> input { line-height: 1.6rem; margin: 10px; } </style>
當一個組件須要獲取多個狀態時候,將這些狀態都聲明爲計算屬性會有些重複和冗餘。爲了解決這個問題,咱們能夠使用mapState
輔助函數幫助咱們生成計算屬性。mapState
函數返回的是一個對象。npm
import { mapState } from "vuex"; computed: { ...mapState({ author: state => state.author, }) }
mark一下 僅供參考 歡迎更正補充 Thanksapp
參考資料:
官網: https://vuex.vuejs.org/zh/
npm_vuex: https://www.npmjs.com/package...
source: https://github.com/Wscats/vue...異步