欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vuex中的Mutation使用詳解

 更新時(shí)間:2023年11月13日 10:56:33   作者:mumuwei_l  
這篇文章主要介紹了Vuex中的Mutation使用詳解,當(dāng)我們想修改狀態(tài)值,想傳入的值進(jìn)而進(jìn)行修改時(shí),你可以向 store.commit 傳入額外的參數(shù),即 mutation 的 載荷,需要的朋友可以參考下

一、Mutation的作用

更改 Vuex 的store 中的狀態(tài)的唯一方法是提交 mutation。 Vuex 中的 mutation 非常類似于事件:

  • 每個(gè) mutation 都有一個(gè)字符串的 事件類型 (type) 和 一個(gè) 回調(diào)函數(shù) (handler)。
  • 這個(gè)回調(diào)函數(shù)就是我們實(shí)際進(jìn)行狀態(tài)更改的函數(shù),并且它會(huì)接受 state 作為第一個(gè)參數(shù):
const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
  	// 第一個(gè)參數(shù)為 state
    add(state) {
      // 變更狀態(tài),即變更值
      state.count++
    }
  }
})
  • 你不能直接調(diào)用一個(gè) mutation handler。

這個(gè)選項(xiàng)更像是事件注冊(cè):

“當(dāng)觸發(fā)一個(gè)類型為 add 的 mutation 時(shí),調(diào)用此函數(shù)。”要喚醒一個(gè) mutation handler,你需要以相應(yīng)的 type 調(diào)用 store.commit 方法:

store.commit('increment')

二、提交載荷(Payload)

即當(dāng)我們想修改狀態(tài)值,想傳入的值進(jìn)而進(jìn)行修改時(shí),你可以向 store.commit 傳入額外的參數(shù),即 mutation 的 載荷(payload):

// 定義
mutations: {
  // n被稱為載荷, 即為我們傳入的值
  add(state, n) {
    state.count += n
  }
}
// 調(diào)用
store.commit('increment', 10)

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

// 定義
mutations: {
  add(state, payload) {
    state.count += payload.amount
  }
}
// 調(diào)用
store.commit('increment', {
  amount: 10
})

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

提交 mutation 的另一種方式是直接使用包含 type 屬性的對(duì)象:

store.commit({
  type: 'increment',
  amount: 10
})

當(dāng)使用對(duì)象風(fēng)格的提交方式,整個(gè)對(duì)象都作為載荷傳給 mutation 函數(shù),因此 handler 保持不變:

mutations: {
  add(state, payload) {
    state.count += payload.amount
  }
}

四、Mutation 需遵守 Vue 的響應(yīng)規(guī)則

最好提前在你的 store 中初始化好所有所需屬性。

若需要在對(duì)象上添加新屬性時(shí),你應(yīng)該:

  1. 使用 Vue.set(obj, 'newProp', 123)
  2. 以新對(duì)象替換老對(duì)象。例如,利用對(duì)象展開運(yùn)算符我們可以這樣寫:
state.obj = { ...state.obj, newProp: 123 }

五、Mutation 必須是同步函數(shù) !?。?/h2>

一條重要的原則就是要記住 mutation 必須是同步函數(shù)。為什么?請(qǐng)參考下面的例子:

mutations: {
  someMutation (state) {
     // 一秒后count++
    setTimeout(() => {
      state.count++
    }, 1000)
  }
}

現(xiàn)在想象,我們正在 debug 一個(gè) app 并且觀察 devtool 中的 mutation 日志。每一條mutation 被記錄,devtools 都需要捕捉到前一狀態(tài)和后一狀態(tài)的快照。然而,在上面的例子中 mutation 中的異步函數(shù)中的回調(diào)讓這不可能完成:因?yàn)楫?dāng) mutation 觸發(fā)的時(shí)候,回調(diào)函數(shù)還沒有被調(diào)用,devtools 不知道什么時(shí)候回調(diào)函數(shù)實(shí)際上被調(diào)用——實(shí)質(zhì)上任何在回調(diào)函數(shù)中進(jìn)行的狀態(tài)的改變都是不可追蹤的。 即雖然1秒后我們可以實(shí)現(xiàn) state.count++ ,但是 devtools 是無法監(jiān)測(cè)state.count 的改變的。 假設(shè)調(diào)用通過 someMutation count 的值為0, 打開 devtools工具,然后我們調(diào)用 someMutation ,觀察 devtools 的記錄,我肯可以看到 devtools 監(jiān)聽到的 count 的值還是為0, 因?yàn)闀r(shí)異步函數(shù),所以 someMutation 的 state.count++ 操作還沒有執(zhí)行。 大家可以嘗試在自己的瀏覽器使用 devtools 工具試試看。

六、在組件中提交 Mutation

你可以在組件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 輔助函數(shù)將組件中的 methods 映射為 store.commit 調(diào)用(需要在根節(jié)點(diǎn)注入 store)。

// main.js
// 根節(jié)點(diǎn)引入store
new Vue({
  el: '#app',
  store
})
// 組件
// 引入輔助函數(shù) mapMutations 
import { mapMutations } from 'vuex'
export default {
  methods: {
    // 將 `this.add()` 映射為 `this.$store.commit('add')`
    // `mapMutations` 也支持載荷:
    // 將 `this.addBy(amount)` 映射為 this.$store.commit('addBy', amount)`
    ...mapMutations(['add', 'addBy']),
    // 將 `this.increment()` 映射為 `this.$store.commit('add')`
    ...mapMutations({
      increment: 'add' 
    })
  }
}

到此這篇關(guān)于Vuex中的Mutation使用詳解的文章就介紹到這了,更多相關(guān)Vuex中的Mutation內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue如何給頁面增加url前綴

    vue如何給頁面增加url前綴

    這篇文章主要介紹了vue如何給頁面增加url前綴問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • vue2使用el-date-picker實(shí)現(xiàn)動(dòng)態(tài)日期范圍demo

    vue2使用el-date-picker實(shí)現(xiàn)動(dòng)態(tài)日期范圍demo

    這篇文章主要為大家介紹了vue2使用el-date-picker實(shí)現(xiàn)動(dòng)態(tài)日期范圍示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • fetch網(wǎng)絡(luò)請(qǐng)求封裝示例詳解

    fetch網(wǎng)絡(luò)請(qǐng)求封裝示例詳解

    這篇文章主要介紹了fetch網(wǎng)絡(luò)請(qǐng)求封裝的示例內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • vue項(xiàng)目打包并部署到Linux服務(wù)器的詳細(xì)過程

    vue項(xiàng)目打包并部署到Linux服務(wù)器的詳細(xì)過程

    我們?cè)跁?huì)開發(fā)項(xiàng)目的同時(shí),也應(yīng)該了解一下項(xiàng)目是如何部署到服務(wù)器的,下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目打包并部署到Linux服務(wù)器的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Vue之定義全局工具類問題

    Vue之定義全局工具類問題

    這篇文章主要介紹了Vue之定義全局工具類問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue+element 模態(tài)框表格形式的可編輯表單實(shí)現(xiàn)

    vue+element 模態(tài)框表格形式的可編輯表單實(shí)現(xiàn)

    這篇文章主要介紹了vue+element 模態(tài)框表格形式的可編輯表單實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • vue+iview 兼容IE11瀏覽器的實(shí)現(xiàn)方法

    vue+iview 兼容IE11瀏覽器的實(shí)現(xiàn)方法

    這篇文章主要介紹了vue+iview 兼容IE11瀏覽器的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • vue開發(fā)拖拽進(jìn)度條滑動(dòng)組件

    vue開發(fā)拖拽進(jìn)度條滑動(dòng)組件

    這篇文章主要為大家詳細(xì)介紹了vue開發(fā)拖拽進(jìn)度條滑動(dòng)組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Vue一個(gè)案例引發(fā)的遞歸組件的使用詳解

    Vue一個(gè)案例引發(fā)的遞歸組件的使用詳解

    這篇文章主要介紹了Vue一個(gè)案例引發(fā)的遞歸組件的使用,本文主要給大家展示如何在項(xiàng)目中使用遞歸組件,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • vue實(shí)現(xiàn)全匹配搜索列表內(nèi)容

    vue實(shí)現(xiàn)全匹配搜索列表內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)全匹配搜索列表內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評(píng)論