mutations.js 是 Vue.js 中用來管理 Store 中 state 的文件,它包含了 store 的 mutation 變量和方法,當 state 發生變化時,它可以通過 dispatch 方法進行調用。
mutations.js 中最重要的元素是 mutation 方法。這些方法不同于普通函數,它們的作用是修改 Store 中的 state 屬性。當進行數據修改時,我們應該通過 mutations.js 的方式進行,這樣讓代碼更加模塊化,提高代碼的可讀性。
export default { increment(state) { state.count++; }, decrement(state) { state.count--; } }
在 mutations.js 中定義的方法,都應該是同步操作的,而且不能進行異步操作。Vue 中的 mutation 可以從組件的 methods 中調用,執行的順序是與調用順序保持一致。
實際開發中,可能會有多個組件共用同一個 state,而且在不同組件中對 state 進行修改時,Vue.js 的數據流應該是單向的。為了保證這種數據流的單一性,mutations.js 中應該只包含純函數。
export default { setList(state, list) { state.list = list; }, addItem(state, item) { state.list.push(item); } }
在上面的例子中,setList 方法是一個純函數,它的作用只是將 list 替換成新的列表,沒有任何副作用,而 addItem 方法是不純的,是將新的 item 存入了 list 中。
mutations.js 中的 mutation 方法有一個很奇妙的特點:它們不能接收異步操作。這個限制是有原因的,在開發過程中,我們需要知道哪個方法會修改 state,修改之后會影響到哪些組件,同步操作可以追蹤修改狀態的操作,但異步操作在多個組件之間的數據同步會帶來很大的困惑。
在實際開發過程中,經常會看到通過 AJAX/HTTP 請求從后端獲取數據然后修改 state。這里可以使用 Promise 進行異步處理,并使用 mutation 方法進行 state 的同步操作。
export default { async getUserList({ commit }) { const response = await axios.get('/userlist'); commit('setList', response.data); } }
在上面的例子中,我們通過 getUserList 方法從后端獲取了用戶列表,然后將結果存在了 state 的 list 屬性中。
總結來說,在 mutations.js 中定義 store 的 mutation 方法是為了規范代碼的同步操作。每個 mutation 方法應該都是單一的操作,不能夠進行異步處理。我們可以通過 dispatch 方法調用 mutations.js 中的方法,也可以通過設計模式中的訂閱-發布模式來監聽 state 中屬性變化。