第四十一節(jié):Vuex狀態(tài)管理: Mutation的使用

1 Mutations使用

1.1關(guān)于Mutations使用說明:
  1. 更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation
  2. mutations非常類似于事件,都有一個(gè)字符串的事件類型type和一個(gè)回調(diào)函數(shù)handler
  3. 這個(gè)回調(diào)函數(shù)就是修改狀態(tài)的地方,
  4. store對象提供了一個(gè)commit方法用來觸發(fā)mutations中的事件, 有點(diǎn)類似于$emit
1.2 定義與使用mutation
1.2.1 定義mutations
let store = new Vuex.Store({
    state:{
        count: 0
    },

    // 定義mutations
    mutations:{
        increment(){
            // console.log(this); //this 是store對象
            this.state.count++   // 修改狀態(tài)中的數(shù)據(jù)
        }
    }
})

1.2.2 使用mutations函數(shù)修改數(shù)據(jù)
// 組件中
export default {
    // ...
    methods:{
        increment(){
            // 在組件中通過commit觸發(fā)mutations中的函數(shù)
            this.$store.commit("increment")

        },
    }
}

2 關(guān)于mutations函數(shù)的參數(shù)

2.1 mutations參數(shù)說明:
  1. mutations函數(shù)只接受兩個(gè)參數(shù)
  2. mutations函數(shù)可以接受兩個(gè)參數(shù),第一個(gè)參數(shù)就是state狀態(tài),
  3. 第二個(gè)參數(shù)是在通過commit觸發(fā)mutations函數(shù)時(shí)傳遞的載荷(Payload,其實(shí)就是自定義傳參)
2.2 mutations函數(shù)的第一個(gè)參數(shù)

說明:

  1. 上一個(gè)示例中我們是采用了this.state.count++的方式修改數(shù)據(jù)的
  2. mutations函數(shù)接受的第一個(gè)參數(shù)就是state狀態(tài)對象,因?yàn)槲覀兛梢灾苯油ㄟ^state修改狀態(tài)

示例代碼:

let store = new Vuex.Store({
    state:{
        count: 0
    },

    // 定義mutations
    mutations:{
        increment(state){
            // mutations函數(shù)的第一個(gè)參數(shù)就是state對象
            // console.log(state);

            state.count++
        }
    }
})

2.3 mutations的第二個(gè)參數(shù)

官網(wǎng)關(guān)于第二個(gè)參數(shù)的說法叫做提交載荷(Payload)

也就是說我們在組件中使用commit觸發(fā)mutations函數(shù)是,還可以傳入額外的參數(shù)

mutations

let store = new Vuex.Store({
  state:{
    count: 0
  },

  // 定義mutations
  mutations:{
    increment(state, num){
        // 通過第二個(gè)參數(shù)指定state狀態(tài)修改
      state.count += num
    }
  }
})

組件觸發(fā)

export default {

    // ...
    methods:{
        increment(){
            // 觸發(fā)mutations函數(shù)是,指定額外的參數(shù)
            this.$store.commit("increment",2)

        },

    }

}

大多數(shù)情況下,載荷也就是第二個(gè)參數(shù)應(yīng)該是一個(gè)對象,

原因在于對象可以傳遞多個(gè)數(shù)據(jù),如果傳遞普通類型的值只能傳遞一個(gè)

export default {

    // ...
    methods:{
        increment(){
            // 觸發(fā)mutations函數(shù)是,指定額外的參數(shù)
            this.$store.commit("increment",{
                num: 2
            })

        },

    }

}

3. 關(guān)于Mutations的風(fēng)格

提交的另外一種風(fēng)格:直接使用包含 type 屬性的對象:

示例代碼如下

export default {

    // ...
    methods:{
        increment(){
            // 觸發(fā)mutations函數(shù)是,指定額外的參數(shù)
            this.$store.commit({
                type:"increment",
                num: 2
            })

        },

    }

}

此時(shí)Mutations函數(shù)不用做任何改變

let store = new Vuex.Store({
    state:{
        count: 0
    },

    // 定義mutations
    mutations:{
        increment(state, payload){
            console.log(payload);
            /*
            {
                type:"increment",
                num: 2
            }
            */
            state.count += payload.num
        }
    }
})

會(huì)自動(dòng)觸發(fā)payload中type屬性對應(yīng)的mutations函數(shù), commit參數(shù)對象整體就是Payload

4. Mutation需要遵循Vue的響應(yīng)規(guī)則

既然 Vuex 的 store 中的狀態(tài)是響應(yīng)式的加矛,那么當(dāng)我們變更狀態(tài)時(shí)冬耿,監(jiān)視狀態(tài)的 Vue 組件也會(huì)自動(dòng)更新.

因此Vuex中的mutation也需要Vue的響應(yīng)規(guī)則

4.1 觸發(fā)響應(yīng)的注意事項(xiàng)
  1. 最好提前在你的 store 中初始化好所有所需屬性闲擦。
  2. 使用 Vue.set(obj, 'newProp', 123)方法新增對象的屬性
  3. 使用新對象替換老對象的方式觸發(fā)響應(yīng)
4.2 示例代碼

利用擴(kuò)展運(yùn)算來創(chuàng)建新對象替換老對象

state.obj = { ...state.obj, newProp: 123 }

5. Mutation必須是一個(gè)同步函數(shù)

5.1 同步函數(shù)說明
  1. 一條重要的原則就是要記住 mutation 必須是同步函數(shù)
  2. 如果mutation是一個(gè)異步函數(shù), 異步修改狀態(tài),那么devtools將不能跟蹤到數(shù)據(jù)的變化
  3. 因?yàn)?code>devtools 都需要捕捉到前一狀態(tài)和后一狀態(tài)的快照
  4. 如果是異步函數(shù)將沒發(fā)捕捉到快照信息
5.2 示例代碼
let store = new Vuex.Store({
  state:{
    count: 0
  },

  // 定義mutations
  mutations:{
    increment(state, payload){

        //mutation中異步修改狀態(tài)
      setTimeout(() => {
        state.count += payload.num
      },2000)

      console.log(this);

})

此時(shí)devtools中沒發(fā)監(jiān)聽狀態(tài)state的變化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焕济,一起剝皮案震驚了整個(gè)濱河市纷妆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晴弃,老刑警劉巖掩幢,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件上鞠,死亡現(xiàn)場離奇詭異际邻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芍阎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門世曾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人能曾,你說我怎么就攤上這事度硝。” “怎么了寿冕?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵蕊程,是天一觀的道長。 經(jīng)常有香客問我驼唱,道長藻茂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任玫恳,我火速辦了婚禮辨赐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘京办。我一直安慰自己掀序,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布惭婿。 她就那樣靜靜地躺著不恭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪财饥。 梳的紋絲不亂的頭發(fā)上换吧,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機(jī)與錄音钥星,去河邊找鬼沾瓦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贯莺。 我是一名探鬼主播风喇,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乖篷!你這毒婦竟也來了响驴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤撕蔼,失蹤者是張志新(化名)和其女友劉穎豁鲤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲸沮,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琳骡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讼溺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楣号。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怒坯,靈堂內(nèi)的尸體忽然破棺而出炫狱,到底是詐尸還是另有隱情,我是刑警寧澤剔猿,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布视译,位于F島的核電站,受9級特大地震影響归敬,放射性物質(zhì)發(fā)生泄漏酷含。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一汪茧、第九天 我趴在偏房一處隱蔽的房頂上張望椅亚。 院中可真熱鬧,春花似錦舱污、人聲如沸呀舔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽别威。三九已至,卻和暖如春驴剔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粥庄。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工丧失, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惜互。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓布讹,卻偏偏與公主長得像琳拭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子描验,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

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