挑戰全網最幽默的Vuex系列教程:第三講 Vuex旗下的Mutation

来源:https://www.cnblogs.com/justbecoder/archive/2020/04/25/12774013.html
-Advertisement-
Play Games

寫在前面 上一講「Vuex 旗下的 State 和 Getter」,告訴了我們怎麼去使用倉庫 store 中的狀態數據。當然,光會用肯定還不夠,大部分的應用場景還得對這些狀態進行操控,那麼具體如何操控呢,這就是這一講要說的重點。 只有 mutation 能動 State 更改 Vuex 的 stor ...


寫在前面

上一講「Vuex 旗下的 State 和 Getter」,告訴了我們怎麼去使用倉庫 store 中的狀態數據。當然,光會用肯定還不夠,大部分的應用場景還得對這些狀態進行操控,那麼具體如何操控呢,這就是這一講要說的重點。

只有 mutation 能動 State

更改 Vuex 的 store 中的狀態的唯一方法是提交 mutation。Vuex 中的 mutation 非常類似於事件:每個 mutation 都有一個字元串的 事件類型 (type) 和 一個 回調函數 (handler)。這個回調函數就是我們實際進行狀態更改的地方,並且它會接受 state 作為第一個參數:

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    // 事件類型 type 為 increment
    increment (state) {
      // 變更狀態
      state.count++
    }
  }
})

註意,我們不能直接 store.mutations.increment() 來調用,Vuex 規定必須使用 store.commit 來觸發對應 type 的方法:

store.commit('increment')

傳參

我們還可以向 store.commit 傳入額外的參數:

mutations: {
  increment (state, n) {
    state.count += n
  }
}

// 調用
store.commit('increment', 10)
mutation 中的這個額外的參數,官方給它還取了一個高大上的名字:載荷(payload)。說實話,第一次在文檔中看到這個標題「提交載荷」,真的就不想往下看了。

我們往往不是敗給了這些生澀的概念,而是敗給了自己內心的恐懼。

大多數情況下,載荷是一個對象,能夠讓我們更加易讀:

mutations: {
increment (state, payload) {
state.count += payload.amount
}
}
關於提交的方式,有兩種:

// 1、把載荷和type分開提交
store.commit('increment', {
  amount: 10
})

// 2、整個對象都作為載荷傳給 mutation 函數
store.commit({
  type: 'increment',
  amount: 10
})

當然,使用哪種方式沒有絕對的界限,純看自己的喜好,就我個人而言,還是比較傾向於使用第二種姿勢,放在一起更實在。

修改規則

簡單修改基礎類型的狀態數據倒是簡單,沒什麼限制,但是如果修改的是對象,那就要註意了。比如這個例子:

const store = new Vuex.Store({
  state: {
    student: {
      name: '小明',
      sex: '女'
    }
  }
})

這個時候,我們如果想要給 student 添加一個年齡age: 18屬性,怎麼辦呢?

是的,直接在 sex 下麵把這個欄位加上去不就行了,能這樣當然最好了。但是如果我們要動態的修改呢?那就得遵循 Vue 的規則了。如下:

mutations: {
  addAge (state) {
    Vue.set(state.student, 'age', 18)
    // 或者:
    // state.student = { ...state.student, age: 18 }
  }
}

以上就是給對象添加屬性的兩種方式,當然,對於已添加的對象,如果想修改具體值的話,直接更改就是,比如 state.student.age=20 即可。

至於為什麼要這樣,之前我們瞭解過,因為 store 中的狀態是響應式的,當我們更改狀態數據的時候,監視狀態的 Vue 組件也會自動更新,所以 Vuex 中的 mutation 也需要與使用 Vue 一樣遵守這些規則。

使用常量

就是使用常量來替代 mutation 事件的名字。

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'

const store = new Vuex.Store({
  state: { ... },
  mutations: {
    // 使用 ES2015 風格的計算屬性命名功能來使用一個常量作為函數名
    [SOME_MUTATION] (state) {
      // mutate state
    }
  }
})

可能有人會有疑問啊,這樣做到底有啥用,還得多創建個類型文件,用的時候還要導入進來,不嫌麻煩嗎!

我們看看,mutation 是怎麼調用的:store.commit('increment'),可以發現,這裡 commit 提交的方法 increment,是以字元串的形式代入的。如果項目小,一個人開發的話倒還好,但是項目大了,編寫代碼的人多了,那就麻煩了,因為需要 commit 的方法一多,就會顯得特別混亂,而且以字元串形式代入的話,一旦出了錯,很難排查。

所以,對於多人合作的大項目,最好還是用常量的形式來處理 mutation,對於小項目倒是無所謂,想偷懶的隨意就好。

必須是同步函數

一定要記住,Mutation 必須是同步函數。為什麼呢?

前面說了,我們之所以要通過提交 mutation 的方式來改變狀態數據,是因為我們想要更明確地追蹤到狀態的變化。如果像下麵這樣非同步的話:

mutations: {
  someMutation (state) {
    api.callAsyncMethod(() => {
      state.count++
    })
  }
}

我們就不知道什麼時候狀態會發生改變,所以也就無法追蹤了,這與 Mutation 的設計初心相悖,所以強制規定它必須是同步函數。

store.commit('increment')
// 任何由 "increment" 導致的狀態變更都應該在此刻完成。

最在最後

這一講相對來說應該還是比較好理解的。對於官方我覺得比較難理解的,我都儘量用通俗易懂的示例來進行分析,來加深大家的理解,但是不知道效果如何。如果對大家有幫助,歡迎點贊和轉載,註明出處即可。

轉載聲明:

作者:大巨集說
鏈接:https://www.jianshu.com/p/64727454f151

後記

以上就是胡哥今天給大家分享的內容,喜歡的小伙伴記得點贊收藏呦,關註胡哥有話說,學習前端不迷路,歡迎多多留言交流...

胡哥有話說,一個有技術,有情懷的胡哥!現任京東前端攻城獅一枚。
胡哥有話說,專註於大前端技術領域,分享前端系統架構,框架實現原理,最新最高效的技術實踐!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • join(): 將數組的元素組起一個字元串,以 separator 為分隔符,省略的話則用預設用逗號為分隔符,該方法只接收一個參數:即分隔符。 push()和pop(): push() 可以接收任意數量的參數,把它們逐個添加到數組末尾,並返回修改後數組的長度。 pop() 數組末尾移除最後一項,減少 ...
  • 隨著Jquery知識點的結束,我也開始接觸到框架來了。 開始的時候,總是聽到插件和框架等詞,我疑惑框架和插件是啥有啥區別?? 插件可以說有無數種,在網頁中任何一種功能都可以被叫做插件,單獨提取出來,可以供別人使用,而框架是一個超大號的的插件,它將各種方法融合成一體,使用者可以使用它來構造不同的功能。 ...
  • 目前代碼沒有放到GitHub上,之後會放出鏈接 1.目錄結構: 2.index.html文件: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=de ...
  • 一、字面量方式 問題:創建多個對象時會造成 代碼冗餘 ,很占記憶體空間。 二、工廠模式 問題:雖然解決了對象字面量創造對象冗餘的問題,但是 存在對象識別的問題 。 三、構造函數模式 問題:解決了工廠模式的問題,但是 相同方法重覆創建 就浪費了記憶體空間。 四、原型模式 問題:共用方法,解決了構造函數的問 ...
  • NodeJS允許我們發佈自己的npm包,且可以執行我們自定義的command。大部分時候,運行非常好,但如果一個新手或客戶電腦運行你發佈的npm 包 cmd,發現出現了 : ** 不是內部或外部命令,也不是可運行的程式或批處理文件。我們的第一反應肯定是,我電腦沒問題呀。 本著出現問題,解決問題,深究 ...
  • 弄了兩天左右,把這個經典案例做出來了。 下麵是成品圖: html代碼: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>雲道官網</title> <link rel="stylesheet" href="css/style. ...
  • 結合html2canvas和jsPDF實現html頁面轉pdf By:授客 QQ:103355122 實踐環境 win10 Vue 2.9.6 axios 0.18.0 html2canvas 1.0.0-rc.3 jspdf 1.5.3 安裝 html2canvas 進入vue項目所在目錄,然後執 ...
  • 1、如果之前有全局安裝過vue-2,先卸載掉 cnpm uni -g vue-cli 2、安裝vue-cli3 cnpm install -g @vue/cli 3、可以使用vue ui 進入圖形界面創建項目 4、也可以使用命令行進行創建 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...