4.手把手教你使用Vuex - Actions

?? OK!本節(jié)我們來(lái)學(xué)習(xí)使用Actions,Actions存在的意義是vuex作者假設(shè)你在修改state的時(shí)候有異步操作,作者不希望你將異步操作放在Mutations中,所以就給你設(shè)置了一個(gè)區(qū)域拳氢,讓你放異步操作,你看看作者多么用心良苦啊蛋铆,那既然人家都給我們了馋评,那我們豈能有不用之理?

  • ?? 對(duì)于文檔開(kāi)頭的這句話刺啦,我不是很贊同留特,action應(yīng)該是mutation的前一步,怎么是類(lèi)似呢玛瘸?action存在的意義就是執(zhí)行異步操作蜕青,異步操作出結(jié)果后再去commit mutation的,明明是上下級(jí)關(guān)系糊渊,為什么說(shuō)兩者類(lèi)似呢右核?所以不是很贊同。對(duì)于下面兩句話渺绒,我是很贊同的贺喝,action的過(guò)程是執(zhí)行異步操作,其終點(diǎn)就是提交mutation宗兼,能死它也觸碰不到state躏鱼。action就是處在這樣一個(gè)位置。


    image.png
  • ?? 我們?cè)倏匆幌逻@張圖殷绍,action的聲明周期就是上面那一塊染苛,它在組件里被dispatch到,然后進(jìn)入action主到,執(zhí)行異步操作茶行,異步操作(promise)總有一個(gè)結(jié)果的,出結(jié)果后再?zèng)Q定提不提交mutation登钥,應(yīng)該明白啦吧~

image.png
  • ?? 我們直接上一個(gè)代碼畔师,show you the code ~
      1. 修改store/index.js
    const store = new Vuex.Store({
      state:{
        loading: false,
        todoList : [
          {id:1,name:'11'},
          {id:2,name:'22'},
          {id:3,name:'33'},
        ],
        num: 0,
      },
      mutations:{
        setNumIs5(state){
          state.num = 5
        },
        setNumIsWhat(state,payload){
          state.num = payload.num
        }
      },
      actions:{   <----- 增加actions屬性
        setNum(content){  <----- 增加setNum方法,默認(rèn)第一個(gè)參數(shù)是content怔鳖,其值是復(fù)制的一份store
          return new Promise((resolve)=>{  <----- 返回一個(gè)promise茉唉,我們模擬一個(gè)異步操作,1秒后修改num為5
            setTimeout(()=>{
              content.commit('setNumIs5')
              resolve()
            },1000)
          })
        }
      }
    })
    
    • 2.修改App.vue
      async mounted() {
        console.log('舊值---'+this.$store.state.num);
        await this.$store.dispatch('setNum')   <----- actions使用dispatch進(jìn)行觸發(fā)结执,就像mutation使用commit觸發(fā)一樣
        console.log('新值---'+this.$store.state.num);
      },
    
image.png
  • ?? 看了例子度陆,是不是明白了,action就是去commit mutation的献幔,什么異步操作都在action中消化了懂傀,最后再去commit mutation的。

  • ?? 當(dāng)然蜡感,你可以模仿mutation進(jìn)行傳參蹬蚁,就像下面這樣

    actions:{
        setNum(content,payload){   <----- 增加payload載荷
          return new Promise((resolve)=>{
            setTimeout(()=>{
              console.log('測(cè)試載荷---'+payload.id);  <----- 測(cè)試載荷輸出
              content.commit('setNumIs5')
              resolve()
            },1000)
          })
       }
      }
    
    await this.$store.dispatch('setNum',{id:111})    <------ App.vue里調(diào)用的時(shí)候加上載荷(傳參)即可
    
    image.png
  • ?? 官方建議
    你如果不想一直使用this.$store.dispatch('setNum',{id:111})這樣調(diào)用action,你可以采用mapActions的方式郑兴,解構(gòu)到methods進(jìn)行this直接調(diào)用犀斋。

    methods:{
        ...mapMutations({
          setNumIsWhatAlias:'setNumIsWhat'
        }),
        ...mapActions([   <----- 就像這樣,解構(gòu)到methods中
          'setNum'
        ])
      }
    
    await this.setNum({id:222})   <----- 這樣調(diào)用即可
    
    • 當(dāng)然你可以設(shè)置一個(gè)外號(hào)情连,別名叽粹,就像下面這樣:
    methods:{
        ...mapMutations({
          setNumIsWhatAlias:'setNumIsWhat'
        }),
        ...mapActions({  <----- 取別名
          setNumAlias:'setNum'
        })
      }
    
    await this.setNumAlias({id:222})   <----- 這樣調(diào)用即可
    
  • ?? 官方建議2
    在store/index.js中的actions里面,方法的形參可以直接將commit解構(gòu)出來(lái)却舀,這樣可以方便后續(xù)操作虫几。

    actions:{
        setNum({commit},payload){  <----- 直接將content結(jié)構(gòu)掉,解構(gòu)出commit挽拔,下面就可以直接調(diào)用了
          return new Promise((resolve)=>{
            setTimeout(()=>{
              console.log('測(cè)試載荷---'+payload.id);
              commit('setNumIs5')  <----- 直接調(diào)用
              resolve()
            },1000)
          })
        }
      }
    

?? OK辆脸,看到這里,你應(yīng)該明白action在vuex的位置了吧螃诅,什么時(shí)候該用action什么時(shí)候不用它啡氢,你肯定有了自己的判斷,最主要的判斷條件就是我要做的操作是不是異步术裸,這也是action存在的本質(zhì)空执。當(dāng)然,你不要將action和mutation混為一談穗椅,action就是mutation的上一級(jí)辨绊,在action這里處理完異步的一些零碎后,后面的修改state就交給mutation去做了匹表。

?? 好门坷!大致對(duì)vuex的講解就到這里了,看到這里你肯定對(duì)vuex不陌生了袍镀,你會(huì)安裝它默蚌,配置它,讀取state的值苇羡,甚至修飾讀(Getter)绸吸,然后你會(huì)修改里面的值了(Mutation),假如你有異步操作并且需要修改state,那你就要使用本節(jié)的啦(Action)锦茁,這樣攘轩,你就可以在你的項(xiàng)目中用起來(lái)vuex啦!后面的一些文集是在這個(gè)基礎(chǔ)上進(jìn)行優(yōu)化码俩,如果你是個(gè)優(yōu)雅的程序員兒度帮,請(qǐng)繼續(xù)看下去吧!??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稿存,一起剝皮案震驚了整個(gè)濱河市笨篷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓣履,老刑警劉巖率翅,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袖迎,居然都是意外死亡安聘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)瓢棒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浴韭,“玉大人,你說(shuō)我怎么就攤上這事脯宿∧罹保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵连霉,是天一觀的道長(zhǎng)榴芳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)跺撼,這世上最難降的妖魔是什么窟感? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮歉井,結(jié)果婚禮上柿祈,老公的妹妹穿的比我還像新娘。我一直安慰自己哩至,他們只是感情好躏嚎,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著菩貌,像睡著了一般卢佣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箭阶,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天虚茶,我揣著相機(jī)與錄音戈鲁,去河邊找鬼。 笑死嘹叫,一個(gè)胖子當(dāng)著我的面吹牛婆殿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播待笑,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸣皂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抓谴!你這毒婦竟也來(lái)了暮蹂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤癌压,失蹤者是張志新(化名)和其女友劉穎仰泻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體滩届,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡集侯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帜消。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棠枉。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泡挺,靈堂內(nèi)的尸體忽然破棺而出辈讶,到底是詐尸還是另有隱情,我是刑警寧澤娄猫,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布贱除,位于F島的核電站,受9級(jí)特大地震影響媳溺,放射性物質(zhì)發(fā)生泄漏月幌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一悬蔽、第九天 我趴在偏房一處隱蔽的房頂上張望扯躺。 院中可真熱鬧,春花似錦蝎困、人聲如沸缅帘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钦无。三九已至,卻和暖如春盖袭,著一層夾襖步出監(jiān)牢的瞬間失暂,已是汗流浹背彼宠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弟塞,地道東北人凭峡。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像决记,于是被迫代替她去往敵國(guó)和親摧冀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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

  • 安裝 npm npm install vuex --save 在一個(gè)模塊化的打包系統(tǒng)中系宫,您必須顯式地通過(guò)Vue.u...
    蕭玄辭閱讀 2,945評(píng)論 0 7
  • ### store 1. Vue 組件中獲得 Vuex 狀態(tài) ```js //方式一 全局引入單例類(lèi) // 創(chuàng)建一...
    蕓豆_6a86閱讀 732評(píng)論 0 3
  • ### store 1. Vue 組件中獲得 Vuex 狀態(tài) ```js //方式一 全局引入單例類(lèi) // 創(chuàng)建一...
    蕓豆_6a86閱讀 346評(píng)論 0 0
  • ?? OK索昂!首先恭喜你看到了這里,前面我們實(shí)現(xiàn)了從盤(pán)古開(kāi)天辟地開(kāi)始......咳咳扩借,其實(shí)我們從初始化vue項(xiàng)目椒惨,到安...
    木頭就是我呀閱讀 926評(píng)論 0 0
  • 配置 vuex 和 vuex 本地持久化 目錄 vuex是什么 vuex 的五個(gè)核心概念State 定義狀態(tài)(變量...
    sunny688閱讀 2,312評(píng)論 0 23