淺談vuex

一档插,什么是vuex

官方說法:Vuex 是一個專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式厌衙。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài)蝎毡,并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測的方式發(fā)生變化挣轨。

個人理解:Vuex是用來管理組件之間通信的一個插件

二? Vuex 基本使用篇

安裝

npm i vuex -S

項目中的任何地方都要用到vuex,所以要全局注冊vuex度硝,并且使用vuex

import? Vue? from? 'vue'??

import? Vuex? from? 'vuex'??

Vue.use(Vuex)

三 Vuex的核心


1, state

????用來存放組件之間共享的數(shù)據(jù)。他跟組件的data選項類似借浊,只不過data選項是用來存放組件的私有數(shù)據(jù)塘淑。

2, getters

????有時候,我們需要對state的數(shù)據(jù)進行篩選蚂斤,過濾存捺。這些操作都是在組件的計算屬性進行的。如果多個組件需要用到篩選后的數(shù)據(jù)曙蒸,那我們就必須到處重復(fù)寫該計算屬性函數(shù)捌治;或者將其提取到一個公共的工具函數(shù)中,并將公共函數(shù)多處導(dǎo)入 - 兩者都不太理想纽窟。如果把數(shù)據(jù)篩選完在傳到計算屬性里就不用那么麻煩了肖油,getters就是干這個的,你可以把getters看成是store的計算屬性臂港。getters下的函數(shù)接收接收state作為第一個參數(shù),? ?getters 改變不了state的值,下一個mutation是唯一可以改變state的值

3,mutation

????????在 Vuex store 中森枪,實際改變 狀態(tài)(state) 的唯一方式是通過 提交(commit) 一個 mutation。mutations下的函數(shù)接收state作為參數(shù)审孽,接收一個叫做payload(載荷)的東東作為第二個參數(shù)县袱,這個東東是用來記錄開發(fā)者使用該函數(shù)的一些信息,比如說提交了什么佑力,提交的東西是用來干什么的式散,包含多個字段,所以載荷一般是對象(其實這個東西跟git的commit很類似)

還有一點需要注意:mutations方法必須是同步方法打颤!

4,action

????既然mutations只能處理同步函數(shù)暴拄,我大js全靠‘異步回調(diào)’吃飯漓滔,怎么能沒有異步,于是actions出現(xiàn)了

a, Actions 提交的是 mutations乖篷,而不是直接變更狀態(tài)响驴。也就是說,actions會通過mutations撕蔼,讓mutations幫他提交數(shù)據(jù)的變更踏施。

b, Action 可以包含任意異步操作。ajax罕邀、setTimeout畅形、setInterval不在話下

5,module

? ??由于使用單一狀態(tài)樹,應(yīng)用的所有狀態(tài)會集中到一個比較大的對象诉探。當應(yīng)用變得非常復(fù)雜時日熬,store 對象就有可能變得相當臃腫。為了解決以上問題肾胯,Vuex 允許我們將 store 分割成模塊(module)竖席。每個模塊擁有自己的 state、mutation敬肚、action毕荐、getter、甚至是嵌套子模塊——從上至下進行同樣方式的分割艳馒。


四憎亚,vuex實例

A,友情提示:

1弄慰, this.$store.commit 來觸發(fā)之前定義好的 mutations 中的方法

2第美, this.$store 獲取到 store,

3, this.$store.state 來獲取狀態(tài)對象陆爽,

4什往,dispatch:翻譯為‘派發(fā)、派遣’的意思慌闭,觸發(fā)事件時别威,dispatch就會通知actions(跟commit一樣一樣的)參數(shù)跟commit也是一樣的。

5驴剔,context:context 是與 store 實例具有相同方法和屬性的對象省古。 可以通過context.state和context.getters 來獲取 state 和 getters。

6仔拟,new Vuex.Store({}) 表示創(chuàng)建一個Vuex實例衫樊,通常情況下飒赃,他需要注入到Vue實例里. Store是Vuex的一個核心方法利花,字面上理解為“倉庫”的意思科侈。

B,例子

html代碼:

?script代碼:

? Vue.use(Vuex);

? var myStore =new Vuex.Store({

????state:{

????//存放組件之間共享的數(shù)據(jù)

? ? ? name:"HL",

? ? ? age:17,

? ? ? num:1

? ? },

? ? mutations:{

????//顯式的更改state里的數(shù)據(jù)

? ? ? change:function(state,a){

? ? ? ? console.log(state.num += a);

? ? ? },

? ? ? changeAsync:function(state,a){

console.log(state.num +=a);

? ? ? }

},

? ? getters:{

????//過濾state數(shù)據(jù)

? ? ? getAge:function(state){

if (state.age >18)

return state.age

? ? ? ? else

? ? ? ? ? state.age="未成年"

? ? ? ? ? return state.age

? ? ? }

},

? ? actions:{

//設(shè)置延時

? ? ? add:function(context,value){

setTimeout(function(){

//提交事件

? ? ? ? ? context.commit('changeAsync',value);//context:context 是與 store 實例具有相同方法和屬性的對象炒事。

// 可以通過context.state和context.getters 來獲取 state 和 getters臀栈。

? ? ? ? },1000)

}

}

});

? Vue.component('hello',{

template:"

<div>

????<p @click='changeNum'>

????????姓名:{{name}} 年齡:{{age}} 次數(shù):{{num}}

????</p>

? ? ? ? <button @click='changeNumAnsyc'>change</button>

</div>

" ,

? ? computed: {

name:function(){

return this.$store.state.name? //this.$store 獲取到 store, this.$store.state 來獲取狀態(tài)對象,

? ? ? },

? ? ? age:function () {

????????????return this.$store.getters.getAge

? ? ? },

? ? ? num:function(){

? ? ? ? ? ? ? ?return this.$store.state.num

? ? ? }

},

? ? mounted:function(){

console.log(this)

},

? ? methods:{

changeNum:function () {

//在組件中提交

? ? ? ? this.$store.commit('change',10)? ? //this.$store.commit 來觸發(fā)之前定義好的 mutations 中的方法? change是mutations里的函數(shù)挠乳,a=10

? ? ? },

? ? ? changeNumAnsyc:function(){

this.$store.dispatch('add', 5);

? ? ? ? //dispatch:翻譯為‘派發(fā)权薯、派遣’的意思,觸發(fā)事件時睡扬,dispatch就會通知actions(跟commit一樣一樣的)參數(shù)跟commit也是一樣的盟蚣。

? ? ? }

},

? ? data:function(){

return {

// num:5

? ? ? }

}

})

new Vue({

el:"#app",

? ? data:{

name:"dk"

? ? },

? ? store:myStore,

? ? mounted:function(){

????????console.log(this)

????}

})



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卖怜,隨后出現(xiàn)的幾起案子屎开,更是在濱河造成了極大的恐慌,老刑警劉巖马靠,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奄抽,死亡現(xiàn)場離奇詭異,居然都是意外死亡甩鳄,警方通過查閱死者的電腦和手機逞度,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妙啃,“玉大人档泽,你說我怎么就攤上這事∫靖埃” “怎么了茁瘦?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長储笑。 經(jīng)常有香客問我甜熔,道長,這世上最難降的妖魔是什么突倍? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任腔稀,我火速辦了婚禮,結(jié)果婚禮上羽历,老公的妹妹穿的比我還像新娘焊虏。我一直安慰自己,他們只是感情好秕磷,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布诵闭。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疏尿。 梳的紋絲不亂的頭發(fā)上瘟芝,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音褥琐,去河邊找鬼锌俱。 笑死,一個胖子當著我的面吹牛敌呈,可吹牛的內(nèi)容都是我干的贸宏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼磕洪,長吁一口氣:“原來是場噩夢啊……” “哼吭练!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起析显,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤线脚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叫榕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浑侥,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年晰绎,在試婚紗的時候發(fā)現(xiàn)自己被綠了寓落。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡荞下,死狀恐怖伶选,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尖昏,我是刑警寧澤仰税,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站抽诉,受9級特大地震影響陨簇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迹淌,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一河绽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唉窃,春花似錦耙饰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廷痘。三九已至,卻和暖如春件已,著一層夾襖步出監(jiān)牢的瞬間笋额,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工拨齐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昨寞。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓瞻惋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親援岩。 傳聞我的和親對象是個殘疾皇子歼狼,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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