Vuex中mutations的用法及說(shuō)明
Vuex中mutations用法
在 Vuex 中 store 數(shù)據(jù)改變的唯一方法就是提交 mutations
。
mutations
里面裝著一些改變數(shù)據(jù)方法的集合,這是Vuex 設(shè)計(jì)很重要的一點(diǎn),就是把處理數(shù)據(jù)邏輯方法全部放在 mutations
里面,使得數(shù)據(jù)和視圖分離。
Mutations使用
Vuex 中的 mutations 非常類(lèi)似于事件,每個(gè) mutations 都有一個(gè)字符串的事件類(lèi)型(type)和一個(gè)回調(diào)函數(shù)(handler),也可以理解為{type:handler()},這和訂閱發(fā)布有點(diǎn)類(lèi)似。
先注冊(cè)事件,當(dāng)觸發(fā)響應(yīng)類(lèi)型的時(shí)候調(diào)用handker(),調(diào)用type的時(shí)候需要用到store.commit方法。
示例:
這個(gè)回調(diào)函數(shù)會(huì)接受state 作為第一個(gè)參數(shù):
const store = new Vuex.Store({ state: { count: 1 }, mutations: { // 事件類(lèi)型 type 為 increment increment (state) { // 變更狀態(tài) state.count++ } } })
我們不能直接使用store.mutations.increment() 來(lái)調(diào)用,Vuex 規(guī)定必須使用 store.commit 來(lái)觸發(fā)對(duì)應(yīng) type 的方法:
store.commit('increment')
提交載荷(Payload)
載荷簡(jiǎn)單的理解就是往 handler(state) 中傳參 handler(state, pryload) 。
示例:
大多數(shù)情況下,載荷是一個(gè)對(duì)象:
mutations: { // 提交荷載 increment (state, payload) { state.count += payload.amount } }
提交荷載有兩種方式:
// 把載荷和type分開(kāi)提交 store.commit('increment', { amount: 10 }) // 整個(gè)對(duì)象都作為載荷傳給mutation函數(shù) store.commit({ type: 'increment', amount: 10 })
我們可以根據(jù)自己的方式來(lái)選擇使用哪種提交方式。
commit 我們可以在組件中使用 this.$store.commit(‘xxx’) 提交 mutations。
示例:
或者可以使用 mapMutations 輔助函數(shù)將組件中的 methods 映射為 store.commit 調(diào)用(需要在根節(jié)點(diǎn)注入 store)。
示例:
在使用mapMutations 輔助函數(shù)之前同樣需要先引入:
<script> import { mapMutations } from 'vuex' export default { computed:{ count(){ return this.$store.state.count } }, methods:{ ...mapMutations([//采用解構(gòu)的方式引入 'increment', 'decrement' ]) } } </script>
Mutations 需遵守 Vue 的響應(yīng)規(guī)則
Vuex 的 store 中的狀態(tài)是響應(yīng)式的,所以當(dāng)我們變更狀態(tài)時(shí),監(jiān)視狀態(tài)的 Vue 組件也會(huì)自動(dòng)更新。
這也意味著 Vuex 中的 mutations 也需要與使用 Vue 一樣遵守一些注意事項(xiàng),如下所示:
最好提前在 store 中初始化好所有所需屬性。
當(dāng)需要在對(duì)象上添加新屬性時(shí),應(yīng)該使用 Vue.set(obj, ‘newProp’, 123),或者以新對(duì)象替換老對(duì)象。
例如利用對(duì)象展開(kāi)運(yùn)算符可以寫(xiě)成:state.obj = {…state.obj, newProp: 123 }。
使用常量替代 Mutations 事件類(lèi)型
使用常量替代 mutations 事件類(lèi)型在各種 Flux 實(shí)現(xiàn)中是很常見(jiàn)的模式。
這樣可以使 linter 之類(lèi)的工具發(fā)揮作用,同時(shí)把這些常量放在單獨(dú)的文件中可以讓你的代碼合作者對(duì)整個(gè) app 包含的 mutations 一目了然:
// mutation-types.js export const SOME_MUTATION = 'SOME_MUTATION'
store.js 文件內(nèi)容如下所示:
// store.js import Vuex from 'vuex' import { SOME_MUTATION } from './mutation-types' const store = new Vuex.Store({ state: { ... }, mutations: { // 使用 ES2015 風(fēng)格的計(jì)算屬性命名功能來(lái)使用一個(gè)常量作為函數(shù)名 [SOME_MUTATION] (state) { // mutate state } } })
我們知道m(xù)utation 是通過(guò)store.commit(‘increment’)的方式調(diào)用的,其中increment方法是以字符串的形式代入。
如果項(xiàng)目小,一個(gè)人開(kāi)發(fā)的話倒還好,但是項(xiàng)目大了,編寫(xiě)代碼的人多了,那就麻煩了,因?yàn)樾枰?commit 的方法一多,就會(huì)顯得特別混亂,而且以字符串形式代入的話,一旦出了錯(cuò),很難排查。
所以,在需要多人協(xié)作的大型項(xiàng)目中,最好還是用常量的形式來(lái)處理 mutation。
必須是同步函數(shù)
我們要記住的是,Mutation 必須是同步函數(shù)。
因?yàn)槲覀冎砸ㄟ^(guò)提交 mutation 的方式來(lái)改變狀態(tài)數(shù)據(jù),是因?yàn)槲覀兿胍鞔_地追蹤到狀態(tài)的變化。
如果是類(lèi)似下面這樣異步的話:
mutations: { someMutation (state) { api.callAsyncMethod(() => { state.count++ }) } }
我們就不知道什么時(shí)候狀態(tài)會(huì)發(fā)生改變,所以也就無(wú)法追蹤了,這與 Mutation 的設(shè)計(jì)初心相悖,所以強(qiáng)制規(guī)定它必須是同步函數(shù)。
store.commit('increment') // 任何由'increment'導(dǎo)致的狀態(tài)變更都應(yīng)該在此刻完成
需求:
點(diǎn)擊不同的音樂(lè)列表就讓下方播放列表顯示自己點(diǎn)擊的列表,音樂(lè)列表是循環(huán)的
實(shí)現(xiàn)方式:
就是利用vuex中的mutations。在mutations中定義一個(gè)方法,這個(gè)方法就是把點(diǎn)擊的index(也就是每個(gè)列表的唯一標(biāo)識(shí)),傳給state中的當(dāng)前標(biāo)識(shí)。
在循環(huán)列表的頁(yè)面,把setPlayIndex方法引用過(guò)來(lái)用到頁(yè)面中,點(diǎn)擊不同的列表傳不同的index也就是setPlayIndex方法中的不同的value。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue.js異步上傳文件前后端實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了vue.js異步上傳文件前后端的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Vue通過(guò)moment插件實(shí)現(xiàn)獲取當(dāng)前月的第一天和最后一天
這篇文章主要介紹了Vue 結(jié)合插件moment 實(shí)現(xiàn)獲取當(dāng)前月的第一天和最后一天,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10Vue?項(xiàng)目中選擇?TSX?而非傳統(tǒng)?.vue?文件的原因分析
文章探討了Vue項(xiàng)目中使用TSX(TypeScript?JSX)的背景、優(yōu)勢(shì)和局限性,TSX結(jié)合了TypeScript和JSX,增強(qiáng)了類(lèi)型安全和代碼組織性,但也增加了學(xué)習(xí)曲線和可讀性問(wèn)題,對(duì)于復(fù)雜應(yīng)用,TSX提供了更大的靈活性和類(lèi)型支持,逐漸成為一些開(kāi)發(fā)者的選擇2024-11-11一文搞明白vue開(kāi)發(fā)者vite多環(huán)境配置
Vue是一款流行的JavaScript框架,用于開(kāi)發(fā)動(dòng)態(tài)單頁(yè)應(yīng)用程序,本地安裝和環(huán)境配置是學(xué)習(xí)和使用Vue的第一步,下面這篇文章主要給大家介紹了關(guān)于vue開(kāi)發(fā)者vite多環(huán)境配置的相關(guān)資料,需要的朋友可以參考下2023-06-06vue如何通過(guò)$router.push傳參數(shù)
這篇文章主要介紹了vue如何通過(guò)$router.push傳參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Vuejs 頁(yè)面的區(qū)域化與組件封裝的實(shí)現(xiàn)
本篇文章主要介紹了Vuejs 頁(yè)面的區(qū)域化與組件封裝的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09實(shí)現(xiàn)Vue的markdown文檔可以在線運(yùn)行的方法示例
這篇文章主要介紹了實(shí)現(xiàn)Vue的markdown文檔可以在線運(yùn)行的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12vue組件中傳值EventBus的使用及注意事項(xiàng)說(shuō)明
這篇文章主要介紹了vue組件中傳值EventBus的使用及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11