Vuex 是什么?
創(chuàng)新互聯(lián)專注于維西企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設,成都商城網(wǎng)站開發(fā)。維西網(wǎng)站建設公司,為維西等地區(qū)提供建站服務。全流程按需網(wǎng)站開發(fā),專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務
官方給出的解釋:Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。
相信很多新選手看完這段話有種絕望的感覺。開始我也是這樣的,后來我想到了一個比方!
比如某年級有5個小班,每個小班有25個同學,但是只有一個老師授課,假如5個小班就對應著5個組件,每個班的25個同學就相當于每個組件中的25條數(shù)據(jù),這個老師就相當于 vuex ,老師講的課就相當于每一條數(shù)據(jù)。要保證每個同學受到同樣的教育,就需要這個老師把每節(jié)課分別講5遍,還不能保證每個班的同學聽到的效果相同。一段時間后,老師覺得這樣特別麻煩還很累,就想了一個辦法,找了一個大教室,把這5個小班的同學合并到一起,這樣每個課程只需要講一次就好啦,而且還保證了每個班的同學聽到的效果相同。這就是 vuex 的作用,把各個組件中用到的數(shù)據(jù)統(tǒng)一管理,同步發(fā)放,省時省心省力。
那這個 vuex 怎么用呢?讓我們從一個簡單的 Vue 計數(shù)應用開始
一、基本用法
1. 初始化并創(chuàng)建一個項目
vue init webpack-simple vuex-demo cd vuex-demo npm install
2. 安裝 vuex
npm install vuex -S
3. 在 src 目錄下創(chuàng)建 store.js 文件,并在 main.js 文件中導入并配置
store.js 中寫入
import Vue from 'vue' //引入 vuex 并 use import Vuex from 'vuex' Vue.use(Vuex)
main.js 文件
import Vue from 'vue' import App from './App.vue' import store from './assets/store' //導入 store 對象 new Vue({ //配置 store 選項,指定為 store 對象,會自動將 store 對象注入到所有子組件中,在子組件中通過 this.$store 訪問該 store 對象 store, el: '#app', render: h => h(App) })
4. 編輯 store.js 文件
在應用 vuex 之前,我們還是需要看懂這個流程圖,其實很簡單。
vuex
① Vue Components 是我們的 vue 組件,組件會觸發(fā)(dispatch)一些事件或動作,也就是圖中的 Actions;
② 我們在組件中發(fā)出的動作,肯定是想獲取或者改變數(shù)據(jù)的,但是在 vuex 中,數(shù)據(jù)是集中管理的,我們不能直接去更改數(shù)據(jù),所以會把這個動作提交(Commit)到 Mutations 中;
③ 然后 Mutations 就去改變(Mutate)State 中的數(shù)據(jù);
④ 當 State 中的數(shù)據(jù)被改變之后,就會重新渲染(Render)到 Vue Components 中去,組件展示更新后的數(shù)據(jù),完成一個流程。
Vuex 的核心是 Store(倉庫),相當于是一個容器,一個 Store 實例中包含以下屬性的方法:
state 定義屬性(狀態(tài) 、數(shù)據(jù))
store.js 中寫入
// 定義屬性(數(shù)據(jù)) var state = { count:6 } // 創(chuàng)建 store 對象 const store = new Vuex.Store({ state }) // 導出 store 對象 export default store;
方式1、 在 app.vue 中就能通過 this.$store 訪問該 store 對象 ,獲取該 count 。
//把 count 方法直接寫入,可自己執(zhí)行{{count}}
方式2、vuex 提供的 mapGetters 和 mapActions 來訪問
mapGetters 用來獲取屬性(數(shù)據(jù))
① 在 app.vue 中引入 mapGetters
import {mapGetters} from 'vuex'
② 在 app.vue 文件的計算屬性中調(diào)用 mapGetters 輔助方法,并傳入一個數(shù)組,在數(shù)組中指定要獲取的屬性 count
③ 在 store.js 中定義 getters 方法并導出
getters 用來獲取屬性
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) // 定義屬性(數(shù)據(jù)) var state = { count:6 } // 定義 getters var getters={ //需要傳個形參,用來獲取 state 屬性 count(state){ return state.count } } // 創(chuàng)建 store 對象 const store = new Vuex.Store({ state, getters }) // 導出 store 對象 export default store;
這樣頁面上就會顯示傳過來的數(shù)據(jù)了!接下來我們來通過動作改變獲取到的數(shù)據(jù)
④在 store.js 中定義 actions 和 mutations 方法并導出
actions 定義方法(動作)
commit 提交變化,修改數(shù)據(jù)的唯一方式就是顯示的提交 mutations
mutations 定義變化,處理狀態(tài)(數(shù)據(jù))的改變
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) // 定義屬性(數(shù)據(jù)) var state = { count:6 } // 定義 getters var getters={ count(state){ return state.count } } // 定義 actions ,要執(zhí)行的動作,如流程的判斷、異步請求 const actions ={ // ({commit,state}) 這種寫法是 es6 中的對象解構 increment({commit,state}){ //提交一個名為 increment 的變化,名字可自定義,可以認為是類型名,與下方 mutations 中的 increment 對應 //commit 提交變化,修改數(shù)據(jù)的唯一方式就是顯式的提交 mutations commit('increment') } } // 定義 mutations ,處理狀態(tài)(數(shù)據(jù)) 的改變 const mutations ={ //與上方 commit 中的 ‘increment' 相對應 increment(state){ state.count ++; } } // 創(chuàng)建 store 對象 const store = new Vuex.Store({ state, getters, actions, mutations }) // 導出 store 對象 export default store;
⑤ 在 app.vue 中引入 mapActions ,并調(diào)用
mapActions 用來獲取方法(動作)
import {mapGetters,mapActions} from 'vuex'
調(diào)用 mapActions 輔助方法,并傳入一個數(shù)組,在數(shù)組中指定要獲取的方法 increment
//這個 increment 方法與下面 methods 中的 increment 相對應{{count}}
這樣就能通過 button 來改變獲取到的 count 了。
看起來確實是挺繞的,需要在理解了原理的情況下,再細細琢磨,加深理解。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。