詳解vuex狀態(tài)管理模式
一、前言
本次接受一個(gè)BI系統(tǒng),要求是能夠接入數(shù)據(jù)源-得到數(shù)據(jù)集-對(duì)數(shù)據(jù)集進(jìn)行處理-展現(xiàn)為數(shù)據(jù)的可視化,這一個(gè)系統(tǒng)為了接入公司自身的產(chǎn)品,后端技術(shù)采用spring boot,前端采用vue+vuex+axios的項(xiàng)目架構(gòu)方式,vuex作為vue的狀態(tài)管理,是尤為重要的部分。這里,我將vuex如何運(yùn)作和使用做一次總結(jié),有錯(cuò)的地方,望多多提點(diǎn)。
二、vuex簡(jiǎn)單使用
安裝vuex
cnpm install vuex --save
在src目錄下建立文件夾,命名為store,建立index.js
如圖所示:

在index.js中引入vue和vuex狀態(tài)管理,并導(dǎo)出vuex,代碼如下:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
token: 0
},
})
export default store;
在main.js中引入剛剛創(chuàng)建好的store并作為vue的store
import Vue from 'vue'
import App from './App.vue'
import store from './store/index'
Vue.config.productionTip = false
new Vue({
render: h => h(App)
,
store
}).$mount('#app')
獲得store里的token
在vue的組件中,想要獲得vuex里的全局?jǐn)?shù)據(jù),可以把vue看做一個(gè)類(lèi),在其下面有許多屬性,其中有我們剛剛注入的vuex,如圖

我們可以看到vue他本身就是一個(gè)json,在其下有$store這個(gè)對(duì)象,而$store下又有state,state下得就是我們存儲(chǔ)在vue中的全局?jǐn)?shù)據(jù),在組件中通過(guò)this.$store.state.token即可獲得我們的數(shù)據(jù)。
三、vuex的核心概念之getters
有時(shí)候我們需要在獲得的數(shù)據(jù)做一些簡(jiǎn)單的過(guò)濾或者處理的時(shí)候,getters就起到作用了。
代碼如下
getters:{
getToken(state){
return state.token;
}
同直接獲取token的方式一樣。getters也已經(jīng)掛載到了$store下,故,我們可以通過(guò)this.$store.state.getters.getToken的方式,調(diào)用其函數(shù)。 但vuex為我們提供了mapGetters能夠?qū)⑵溆成涞綄?duì)應(yīng)的getters的方法上去,用法如下所示
import {mapGetters,mapActions} from 'vuex'
export default {
name: 'app',
components: {
HelloWorld
},
computed:{
...mapGetters(["getToken"])
},
mounted() {
console.log(this.getToken)
console.log(this.$store.getters.getToken)
},
}
映射出來(lái)的getters仍然掛載在vue上,如圖所示

四、vuex的核心概念之mutations與actions
我們可以吧mutations理解成一個(gè)事件函數(shù),而actions就是觸發(fā)器,通過(guò)actions,發(fā)起動(dòng)作。
簡(jiǎn)單實(shí)例代碼如下。
mutations:{
setToken(state,n){
state.token=state.token+n;
}
},
actions:{
setToken({commit},n){
commit('setToken',n)
}
}
在組件中的使用,同getters的用法,代碼如下
import {mapGetters,mapActions} from 'vuex'
export default {
name: 'app',
components: {
HelloWorld
},
computed:{
...mapGetters(["getToken"])
},
mounted() {
console.log(this)
console.log(this.setToken(1))
console.log(this.getToken)
},methods:{
...mapActions(["setToken"])
},
在vue的json中,同樣可以找到相同的屬性。

五、vuex核心概念之mudules
vuex允許我們將store分為不同的模塊,每個(gè)單獨(dú)的模塊具備getters,state,mutations,actions這四個(gè)store核心,
需要注意的是如果在模塊內(nèi)部加入了namesapced:true這一個(gè)屬性。在取值的時(shí)候需要做一點(diǎn)細(xì)微的變動(dòng),通過(guò)mapGetters火mapActions映射時(shí)需要將模塊名作為路勁,來(lái)獲得該模塊的getters,和actions,模塊化代碼如下
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const moduleA = {
namespaced:true,
state: { a:1 },
mutations: { },
actions: { },
getters: { geta(state){
return state.a;
} }
}
const moduleB = {
namespaced:true,
state: { b:1},
mutations: { },
actions: {}
}
const store = new Vuex.Store({
state: {
token: 0
},
getters:{
getToken(state){
return state.token;
},
} , mutations:{
setToken(state,n){
state.token=state.token+n;
}
},
actions:{
setToken({commit},n){
commit('setToken',n)
}
},
modules: {
a: moduleA,
b: moduleB
},
})
export default store;
在組件中獲得模塊A的值得時(shí)候,我們來(lái)看一下geta這個(gè)getters屬性,在vue中的狀態(tài),如圖所示

geta為模塊a下得getters屬性,在獲取的時(shí)候就需要這樣
computed:{
// ...mapGetters(["getToken"])
...mapGetters("a",["geta"])
},
mounted() {
console.log(this)
console.log(this.geta)
而如果模塊沒(méi)有命令空間的話(huà),vuex會(huì)自動(dòng)將模塊內(nèi)的getters,actions注入為全局的,直接按照原來(lái)個(gè)獲取方式就可以了。
六、總結(jié)
這是我對(duì)vuex的基本用法和基本理解方式,vuex當(dāng)然不可能局限于此,此處只列舉了最簡(jiǎn)單的,做個(gè)總結(jié)的同時(shí)也等同于記下,據(jù)說(shuō)vue3塊出了,是用ts重寫(xiě)的vue,到時(shí)再去看看,vue3又有了哪些變化,和哪些可取之處。本文所寫(xiě),有不對(duì)的地方,大家多多提出來(lái)。共同進(jìn)步。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue拿到二進(jìn)制流圖片如何轉(zhuǎn)為正常圖片并顯示
這篇文章主要介紹了Vue拿到二進(jìn)制流圖片如何轉(zhuǎn)為正常圖片并顯示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
vue如何解決el-select下拉框顯示ID不顯示label問(wèn)題
這篇文章主要介紹了vue如何解決el-select下拉框顯示ID不顯示label問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
vue從倉(cāng)庫(kù)state中取不到數(shù)據(jù)的問(wèn)題
這篇文章主要介紹了vue從倉(cāng)庫(kù)state中取不到數(shù)據(jù)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue-cli創(chuàng)建的項(xiàng)目,配置多頁(yè)面的實(shí)現(xiàn)方法
下面小編就為大家分享一篇vue-cli創(chuàng)建的項(xiàng)目,配置多頁(yè)面的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Vue.js實(shí)現(xiàn)文件上傳壓縮優(yōu)化處理技巧
這篇文章主要介紹了Vue.js實(shí)現(xiàn)文件上傳壓縮優(yōu)化處理,本文給大家介紹兩種方法一種是借助canvas的封裝的文件壓縮上傳,二是使用compressorjs第三方插件實(shí)現(xiàn),本文給大家介紹的非常詳細(xì)需要的朋友可以參考下2022-11-11
vue+elementUI實(shí)現(xiàn)分頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了vue+elementUI實(shí)現(xiàn)分頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
vue3+element Plus如何實(shí)現(xiàn)彈框的拖拽、可點(diǎn)擊底層頁(yè)面功能
這篇文章主要介紹了vue3+element Plus如何實(shí)現(xiàn)彈框的拖拽、可點(diǎn)擊底層頁(yè)面功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
在Vue中延遲執(zhí)行某個(gè)函數(shù)的實(shí)現(xiàn)方式
在Vue中延遲執(zhí)行某個(gè)函數(shù),你可以使用setTimeout()函數(shù)或者Vue提供的生命周期鉤子函數(shù),本文通過(guò)一些示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12

