第三節(jié):Mutations

Mutations修改狀態(tài)的值

Vue的視圖是由數(shù)據(jù)驅(qū)動(dòng)的,也就是說state里面的數(shù)據(jù)是動(dòng)態(tài)變化的,那么怎么改變呢妄呕,切記在Vuex中store數(shù)據(jù)改變的唯一方法就是mutation潜慎!什么意思?也就算說我們不能夠直接通過一個(gè)事件或方法去修改state中的狀態(tài)司抱,必須將事件提交(commit)給mutation筐眷,并且事件接收state作為第一個(gè)參數(shù)。

通俗的理解习柠,mutations里面裝著一些改變數(shù)據(jù)方法的集合匀谣,這是Veux設(shè)計(jì)很重要的一點(diǎn),就是把處理數(shù)據(jù)邏輯方法全部放在mutations里面资溃,使得數(shù)據(jù)和視圖分離武翎。

每個(gè) mutation 都有一個(gè)字符串的事件類型 (type) 和 一個(gè)回調(diào)函數(shù) (handler)。事件類型就是通過$store.commit()提交的事件溶锭,比如:$store.commit('add')宝恶,回調(diào)函數(shù)就是我們實(shí)際進(jìn)行狀態(tài)更改的地方,它作為store中的mutations對(duì)象里的一個(gè)屬性而存在趴捅。

下面通過例子來一看究竟:

通過$store.commit()的方式提交

1垫毙、在組件中

<div>
      <h1>{{ msg }}</h1>
      <div>{{ count }}</div>
      <!--調(diào)用type 觸發(fā)回調(diào)-->
      <button @click = "$store.commit('add')">+</button>
      <button @click = "$store.commit('reduce')">-</button>
  </div>

2、在store.js中定義一個(gè)常量mutations對(duì)象拱绑。

const mutations = {
    add(state){ //注冊(cè)事件  type:add  回調(diào)第一個(gè)參數(shù)是state
        state.count++
    },
    reduce(state){
        state.count--
    }
}

然后將mutations和state導(dǎo)出去

export default new Vuex.Store({
    state,
    mutations
})

3露久、組件中引入store

import store from '@/vuex/store'

export default {
     data(){
        return {
            msg: "加減運(yùn)算"
        }
    },
    store,
    computed:mapState([
        'count'
    ])
}

傳值( 提交載荷(Payload))

剛才只是一個(gè)簡(jiǎn)單的修改state中的屬性,而在實(shí)際項(xiàng)目中往往會(huì)有值傳遞欺栗。

$store.commit()接收額外的參數(shù)毫痕,稱之為mutations的載荷征峦。

1、比如我們?cè)诩訙p時(shí)分別傳入不同的參數(shù)

<button @click = "$store.commit('add', 20)">+</button>
<button @click = "$store.commit('reduce', 10)">-</button>

2消请、在mutations中接收參數(shù)

const mutations = {
    add(state, val){
        state.count += val
    },
    reduce(state, val){
        state.count -= val
    }
}

在大多數(shù)情況下栏笆,載荷應(yīng)該是一個(gè)對(duì)象,這樣可以包含多個(gè)字段并且記錄的 mutation 會(huì)更易讀臊泰。

<!--需要注意的是蛉加,對(duì)象中的屬性一定要加引號(hào)-->
<button @click = "$store.commit('add', { 'amount': 20 } )">+</button>
<button @click = "$store.commit('reduce', { 'amount': 10 } )">-</button>
const mutations = {
    add(state, val){
        state.count += val.amount
    },
    reduce(state, val){
        state.count -= val.amount
    }
}

對(duì)象風(fēng)格的提交方式

還有一種提交方式是對(duì)象風(fēng)格的提交,也就是提交mutation的時(shí)候直接使用type屬性的對(duì)象缸逃。

上代碼吧:

<button @click = "$store.commit({type: 'add', 'num': 20})">+</button>
<button @click = "$store.commit({type: 'reduce', 'num': 10})">-</button>

同理针饥,在實(shí)際開發(fā)中,如果一個(gè)組件有多個(gè)事件需频,在模板中通過$store.commit()這種方式來提交mutation和傳值丁眼,肯定會(huì)造成代碼冗余且不利于維護(hù)≌蜒常可以通過mapMutations輔助函數(shù)將組件中的 methods 映射為 store.commit 調(diào)用苞七。

在組件中提交Mutations

1、首先引入mapMutations

import { mapState, mapMutations } from 'vuex'

2挪丢、添加methods屬性蹂风,并加入mapMutations

export default {
    data() {
        return {
            msg: "加減運(yùn)算"
        }
    },
    store,
    computed: mapState([
        'count'
    ]),
    // methods: mapMutations([
    //     'add', 'reduce'
    // ]),

    //或者
    methods: {
        //如果組件中事件的名稱和mutations中方法的名稱相同,可以傳一個(gè)字符串?dāng)?shù)組
        ...mapMutations([
            'add'  //映射 this.add() 為 this.$store.commit('add')
        ]),
        //組件中的事件名和mutations中的方法名不一樣乾蓬,傳入對(duì)象
        ...mapMutations({
            reduces: 'reduce' //映射 $this.reduces 為 this.store.commit('reduce')
        })
    }
}

Mutations必須是同步函數(shù)

一條重要的原則是Mutations必須是同步函數(shù)惠啄。

store.commit('add')
//任何由add事件改變的狀態(tài)都應(yīng)該在此刻完成。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末任内,一起剝皮案震驚了整個(gè)濱河市撵渡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌族奢,老刑警劉巖姥闭,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異越走,居然都是意外死亡棚品,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門廊敌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铜跑,“玉大人,你說我怎么就攤上這事骡澈」模” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵肋殴,是天一觀的道長(zhǎng)囤锉。 經(jīng)常有香客問我坦弟,道長(zhǎng),這世上最難降的妖魔是什么官地? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任酿傍,我火速辦了婚禮,結(jié)果婚禮上驱入,老公的妹妹穿的比我還像新娘赤炒。我一直安慰自己,他們只是感情好亏较,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布莺褒。 她就那樣靜靜地躺著,像睡著了一般雪情。 火紅的嫁衣襯著肌膚如雪遵岩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天旺罢,我揣著相機(jī)與錄音旷余,去河邊找鬼绢记。 笑死扁达,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蠢熄。 我是一名探鬼主播跪解,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼签孔!你這毒婦竟也來了叉讥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤饥追,失蹤者是張志新(化名)和其女友劉穎图仓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體但绕,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡救崔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捏顺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片六孵。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幅骄,靈堂內(nèi)的尸體忽然破棺而出劫窒,到底是詐尸還是另有隱情,我是刑警寧澤拆座,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布主巍,位于F島的核電站冠息,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏孕索。R本人自食惡果不足惜铐达,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望檬果。 院中可真熱鬧瓮孙,春花似錦、人聲如沸选脊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恳啥。三九已至偏灿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钝的,已是汗流浹背翁垂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硝桩,地道東北人沿猜。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碗脊,于是被迫代替她去往敵國和親啼肩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 安裝 npm npm install vuex --save 在一個(gè)模塊化的打包系統(tǒng)中衙伶,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,926評(píng)論 0 7
  • Vuex是什么祈坠? Vuex 是一個(gè)專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,106評(píng)論 0 6
  • vuex 場(chǎng)景重現(xiàn):一個(gè)用戶在注冊(cè)頁面注冊(cè)了手機(jī)號(hào)碼矢劲,跳轉(zhuǎn)到登錄頁面也想拿到這個(gè)手機(jī)號(hào)碼赦拘,你可以通過vue的組件化...
    sunny519111閱讀 8,008評(píng)論 4 111
  • Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài)芬沉,并以相應(yīng)...
    白水螺絲閱讀 4,652評(píng)論 7 61
  • 本文為轉(zhuǎn)載躺同,原文:Vue學(xué)習(xí)筆記進(jìn)階篇——vuex核心概念 前言 本文將繼續(xù)上一篇 vuex文章 ,來詳細(xì)解讀一下...
    ChainZhang閱讀 1,640評(píng)論 0 13