從源碼解釋Vuex的mutations和actions的區(qū)別

? ? ? ?一開始用vuex的時候我也十分疑惑,然后百度一下發(fā)現(xiàn)官網(wǎng)和大部分博客都說的是一個支持同步操作一個支持異步操作,最近開始看源碼發(fā)現(xiàn)其實不完全是這么回事唁毒,先看源碼吧,這里使用的node_modules下的vuex.esm.js星爪。

? ? ? ?mutations是通過commit觸發(fā)的浆西,看看commit的源碼

? ? ? ?這段代碼大致干了什么,參數(shù)type就是你定義的事件類型移必,在簡單的vuex中就是一個代表事件名的字符串(type:'xxxx')室谚,unifyObjectStyle函數(shù)的作用是如果第一個參數(shù)type是對象并且有其中有type字段(type:{type:xxx})就會把第二個參數(shù)賦給第三個參數(shù),第一個參數(shù)賦給第二個參數(shù)崔泵,然后第一個參數(shù)取自身的.type屬性秒赤。

? ? ? ?這里的this._mutations其實就是你在vuex中配置的mutations,entry是一個函數(shù)數(shù)組憎瘸,里面裝的就是你mutations對應(yīng)type的回調(diào)函數(shù)入篮。

? ? ? ?this._withCommit的意義是在其中定義了一個commiting的變量,賦值為this._committing(初始值為false)幌甘,在你entry.forEach遍歷回調(diào)的時候潮售,會簡單的控制_commiting的值痊项,改變store中的變量,加這么一層的意義是在于你使用嚴(yán)格模式的時候酥诽,直接操作this.$store.state中值的時候鞍泉,會拋出 do not mutate vuex store state outside mutation handlers 的異常(所以這里其實暴露了,為啥能直接修改變量肮帐,還會有g(shù)etting這個配置)咖驮。

? ? ? ?最后是this._subscribers,其實你看到這里训枢,并沒有任何一個地方限制commit的異步操作托修,其實他也確實沒有限制,問題就出在this._subscribers中恒界,這個是devtool的控件睦刃,this._subscribers本身是一個函數(shù)數(shù)組,里面裝的是參數(shù)為mutation和state的函數(shù)十酣,函數(shù)大致內(nèi)容為:devtoolHook.emit('vuex:mutation', mutation, state)涩拙,作用是在每次commit執(zhí)行完mutations中回調(diào)的時候,控制瀏覽器插件進(jìn)行跟蹤婆誓,如果你瀏覽器沒有Vue的插件吃环,devtool是一個undefined也颤,所以這里也沒什么意義洋幻。如果你在mutation中使用了異步操作,devtool的鉤子會先于mutations回調(diào)執(zhí)行翅娶,導(dǎo)致無法捕捉store的變化文留。

? ? ? ? 所以如果你本身不使用瀏覽器進(jìn)行調(diào)試的時候,mutations里是可以包含異步操作的竭沫,只是影響使用插件來定位bug燥翅,至少我現(xiàn)在還沒有遇到什么bug,如果有問題也歡迎大家指正蜕提。最后對比一下dispath的源碼森书。

熟悉的Promise熟悉的味道,其實作用就只是把commit里谎势,devtool和mutations的回調(diào)同步處理了而已凛膏,便于程序猿們通過瀏覽器插件定位bug。

? ? ? ? 最直觀的例子就是脏榆,你通過vuex定義一個全局的累加器猖毫,在mutations里寫個setTimeout5000ms的count++,在actions里也寫了一個须喂,你打開瀏覽器的vue插件吁断,瞬間點擊10次累加趁蕊,你使用commit觸發(fā)事件時,右側(cè)調(diào)適會直接出現(xiàn)10個狀態(tài)仔役,然后累加器的狀態(tài)都是0(最后頁面會沒有問題的變成10)掷伙。你用dispatch觸發(fā),那就是在5000s延遲后出現(xiàn)正常的1~10的累加器狀態(tài)(最后頁面上也還是10又兵,沒啥區(qū)別)炎咖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寒波,隨后出現(xiàn)的幾起案子乘盼,更是在濱河造成了極大的恐慌,老刑警劉巖俄烁,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绸栅,死亡現(xiàn)場離奇詭異,居然都是意外死亡页屠,警方通過查閱死者的電腦和手機粹胯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辰企,“玉大人风纠,你說我怎么就攤上這事±蚊常” “怎么了竹观?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長潜索。 經(jīng)常有香客問我臭增,道長,這世上最難降的妖魔是什么竹习? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任誊抛,我火速辦了婚禮,結(jié)果婚禮上整陌,老公的妹妹穿的比我還像新娘拗窃。我一直安慰自己,他們只是感情好泌辫,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布随夸。 她就那樣靜靜地躺著,像睡著了一般甥郑。 火紅的嫁衣襯著肌膚如雪逃魄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天澜搅,我揣著相機與錄音伍俘,去河邊找鬼邪锌。 笑死,一個胖子當(dāng)著我的面吹牛癌瘾,可吹牛的內(nèi)容都是我干的觅丰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼妨退,長吁一口氣:“原來是場噩夢啊……” “哼妇萄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咬荷,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤冠句,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幸乒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懦底,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年罕扎,在試婚紗的時候發(fā)現(xiàn)自己被綠了聚唐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡腔召,死狀恐怖杆查,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情臀蛛,我是刑警寧澤亲桦,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站掺栅,受9級特大地震影響烙肺,放射性物質(zhì)發(fā)生泄漏纳猪。R本人自食惡果不足惜氧卧,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氏堤。 院中可真熱鬧沙绝,春花似錦、人聲如沸鼠锈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽购笆。三九已至粗悯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間同欠,已是汗流浹背样傍。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工横缔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衫哥。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓茎刚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撤逢。 傳聞我的和親對象是個殘疾皇子膛锭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348