Vuex

在 Vue.js 的項(xiàng)目中兽泣,如果項(xiàng)目結(jié)構(gòu)簡(jiǎn)單蹦肴, 父子組件之間的數(shù)據(jù)傳遞可以使用 props 或者 $emit 等方式.
但是如果是大型項(xiàng)目劲够,很多時(shí)候都需要在子組件之間傳遞數(shù)據(jù)职车,使用之前的方式就不太方便。Vue 的狀態(tài)管理工具 [Vuex] 完美的解決了這個(gè)問(wèn)題峦失。
什么是Vuex?
官方說(shuō)法:Vuex 是一個(gè)專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式术吗。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài)尉辑,并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化。
個(gè)人理解:Vuex是用來(lái)管理組件之間通信的一個(gè)插件藐翎。
安裝并引入 Vuex
首先材蹬,安裝 Vuex:

npm install vuex

其次在 src 目錄下,我創(chuàng)建了名為 store 的目錄 ( 這是一種選擇吝镣,你也可以在同級(jí)目錄創(chuàng)建一個(gè) store.js 文件 )堤器,再在其中創(chuàng)建一個(gè)名為 index.js的文件。
index.js中初始化設(shè)置如下:

import Vue from 'vue'  
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state:{ //聲明數(shù)據(jù)
        name:'helloVueX'   
    },
})

main.js 文件中末贾,我們將執(zhí)行以下更新

import Vue from 'vue'
import App from './App'
import store from './store'
new Vue({
  el: '#app',
  store:store,  //store:store 和router一樣闸溃,將我們創(chuàng)建的Vuex實(shí)例掛載到這個(gè)vue實(shí)例中
  components: { App },
  template: '<App/>'
})

在組件中使用Vuex
例如在App.vue中,我們要將state中定義的name拿來(lái)在h1標(biāo)簽中顯示

<template>
    <div id='app'>
        name:
        <h1>{{ $store.state.name }}</h1>
    </div>
</template>

或者要在組件方法中使用

methods:{
    add(){
      console.log(this.$store.state.name)
    }
},

VueX中的核心內(nèi)容
在VueX對(duì)象中拱撵,其實(shí)不止有state,還有用來(lái)操作state中數(shù)據(jù)的方法集辉川,以及當(dāng)我們需要對(duì)state中的數(shù)據(jù)需要加工的方法集等等成員。
state 是存放狀態(tài) 和 Vue 實(shí)例中的 data 遵循相同的規(guī)則
使用如下:

import Vue from 'vue'  
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state:{ //聲明數(shù)據(jù)
        str:'',
        obj:{},
        arr:[],
        num:0,
        bool:true/false
    },
})

getters 是加工state成員給外界 ,可以認(rèn)為是 store 的計(jì)算屬性拴测。getter 的返回值會(huì)根據(jù)它的依賴被緩存起來(lái)乓旗,且只有當(dāng)它的依賴值發(fā)生了改變才會(huì)被重新計(jì)算。
使用方法如下:

import Vue from 'vue'  
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state:{ //聲明數(shù)據(jù)
        shopCar:[]  
    },
getters:{ //可以認(rèn)為是 store 的計(jì)算屬性
        shopCarPrices(state){
            var sum=0
            for(var i=0;i<state.shopCar.length;i++){
                sum+=state.shopCar[i]
            }
            return sum
        }
    }
})

組件中調(diào)用

this.$store.getters.shopCarPrices

mutations是對(duì) state成員操作 集索, Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation屿愚。
使用方法如下:

import Vue from 'vue'  
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state:{ //聲明數(shù)據(jù)
       name:'helloVueX'   
   },
mutations:{
       amend(state){
           state.name = 'jack'
       }
   }
})

而在組件中汇跨,我們需要這樣去調(diào)用這個(gè)mutation——例如在App.vue的某個(gè)method中:

this.$store.commit('amend')

Mutation傳值
單個(gè)值提交時(shí):

this.$store.commit('amend',15)

多個(gè)提交時(shí):

this.$store.commit('amend',{age:15,sex:'男'})

接收掛載的參數(shù):

  amend(state,val){
         state.name = 'jack'
         console.log(val) // 15或{age:15,sex:'男'}
        }

actions 是用來(lái)專門進(jìn)行異步操作,最終提交mutation方法妆距。
由于setTimeout是異步操作穷遂,所以需要使用actions

import Vue from 'vue'  
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state:{ 
       key:''
    },
mutations: {
    updateKey(state,val){
        state.key=val
        console.log(state.key);
    }
  },
actions:{
    updateKey(state,val){
        setTimeout(()=>{
            state.commit('updateKey',val)
        },10)
    }
  }
})

在組件中調(diào)用:

this.$store.dispatch('updateKey',10)

modules 模塊化狀態(tài)管理,每個(gè)模塊擁有自己的 state、mutation娱据、action蚪黑、getter、甚至是嵌套子模塊——從上至下進(jìn)行同樣方式的分割中剩。當(dāng)項(xiàng)目龐大忌穿,狀態(tài)非常多時(shí),可以采用模塊化管理模式结啼。
在創(chuàng)建的store文件夾中在創(chuàng)建一個(gè)a.js文件伴网。
在store中的index.js文件中引入剛創(chuàng)建好的a.js文件

import a  from './a'

在index文件中寫入

 modules:{
        a:a
    },

創(chuàng)建好的a.js文件中寫入模塊,可以寫如我們需要的核心對(duì)象妆棒,語(yǔ)法都是一樣的
比如:

export default {
    state:{
           username :""
    },
    mutations:{
           add(state,val){
           state.username = val
        },
    },
}

組件中傳值

 this.$store.commit('add',res) 
  this.$store.commit('方法名',值) 

組件中調(diào)用

this.$store.state.a.username 
a代表的是在這個(gè)a模塊里 
username 代表的是在a這個(gè)模塊的state中有一個(gè)叫username 的變量

plugins是在vue中使用一些插件 列如可以使用vuex-localstorage
vuex-localstorage 要先進(jìn)行下載 可以使用

npm install vuex-localstorage
cnpm install vuex-localstorage

index.js中引入 vuex-localstorage

import createPersist from 'vuex-localstorage'

使用方法如下:

plugins:[
        createPersist({namespace:"namespace-for-state"})
],
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澡腾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子糕珊,更是在濱河造成了極大的恐慌动分,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件红选,死亡現(xiàn)場(chǎng)離奇詭異澜公,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)喇肋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門坟乾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蝶防,你說(shuō)我怎么就攤上這事甚侣。” “怎么了间学?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵殷费,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我低葫,道長(zhǎng)详羡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任嘿悬,我火速辦了婚禮实柠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘善涨。我一直安慰自己窒盐,他們只是感情好茶行,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著登钥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娶靡。 梳的紋絲不亂的頭發(fā)上牧牢,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音姿锭,去河邊找鬼塔鳍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呻此,可吹牛的內(nèi)容都是我干的轮纫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼焚鲜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掌唾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起忿磅,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤糯彬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后葱她,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撩扒,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年吨些,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搓谆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豪墅,死狀恐怖泉手,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偶器,我是刑警寧澤螃诅,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站状囱,受9級(jí)特大地震影響术裸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亭枷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一袭艺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叨粘,春花似錦猾编、人聲如沸瘤睹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轰传。三九已至,卻和暖如春瘪撇,著一層夾襖步出監(jiān)牢的瞬間获茬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工倔既, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恕曲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓渤涌,卻偏偏與公主長(zhǎng)得像佩谣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子实蓬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容