Vue.js 是目前前端開發中最流行的框架之一。Vue的主要特點是響應式組件化系統,這個特點使得數據和視圖高度解耦。Mutation(變更)是Vue的核心概念之一,是指修改狀態的一種方式。Mutation的作用是保證狀態的變更是可追蹤可調試的。在Vue中,狀態指的是組件中可觀察的數據。
Mutation是Vuex中的概念,它是指修改State的唯一途徑。Mutation提供了一種修改狀態的方法,這種方法不允許直接修改State。Mutation是一種同步操作,必須是純函數(pure function)。純函數是指在相同的輸入參數下始終會生成相同的輸出結果,不會對外部狀態進行操作,也不會觸發外部副作用。Mutation中的操作是同步的,可以保證操作的順序和提交Action的順序一致。
// 定義 mutation const mutations = { increment(state) { state.count++ }, decrement(state) { state.count-- } } // 調用 mutation store.commit('increment') store.commit('decrement')
Mutation是通過commit方法來調用的,提交Mutation和Action一樣都是使用commit方法。Mutation的調用需要指定一個類型(Type),類型是字符串常量,一般與mutation的名稱相同。調用的方式是通過store.commit(Type)來提交。Mutation會接收一個狀態對象(State)作為它的第一個參數,在Mutation中修改State,這個狀態對象是Vuex自動傳遞給Mutation的。
在Mutation中,不能夠直接操作State,如果直接修改State,就無法追蹤狀態的變更,也無法及時響應。Mutation應該被認為是一個狀態改變的記錄,它會記錄下所有修改操作,當需要查看當前狀態時,可以從Mutation中查看。Mutation雖然是同步的,但是它可以在Mutation中觸發異步操作,比如AJAX請求。但是需要注意的是,發起AJAX請求的代碼應該在Action中,而不是在Mutation中。
在實際開發中,Mutation經常被用來進行狀態管理,對于復雜的應用程序,Mutation很容易衍生出問題,比如:界面卡頓、依賴管理問題、狀態管理問題等等。Mutation的規范使用可以避免這些問題的出現,比如:Mutation中只能進行同步操作、Mutation不能觸發異步操作、Mutation只能修改State。
在根據Mutation改變組件中的數據時,我們可以使用computed屬性,讓Vue自動監聽數據變化,只有在真正需要更新數據時才會觸發Mutation,這樣可以節約數據渲染的開銷。另外,為了更好的管理Mutation,我們可以將Mutation拆分成多個小的Mutation,這樣可以減少重復代碼的出現,讓Mutation的代碼更加清潔簡單。