VUEX?使用?mutations的兩種方式
VUEX 使用 mutations
在 Vuex 中 store 數(shù)據(jù)改變的唯一方法就是提交 mutations
。mutations
里面裝著一些改變數(shù)據(jù)方法的集合,這是Vuex 設(shè)計很重要的一點,就是把處理數(shù)據(jù)邏輯方法全部放在 mutations
里面,使得數(shù)據(jù)和視圖分離。
通過這種方式雖然操作起來稍微繁瑣一些,但是可以集中監(jiān)控所有數(shù)據(jù)的變化
示例:
const store = new Vuex.Store({ state: { count: 1 }, mutations: { // 事件類型 type 為 increment increment (state) { // 變更狀態(tài) state.count++ } } })
第一種使用方式:
this.$store.commit() 是觸發(fā)mutations的第一種方式,
示例:
// 方法 mutations:{ // 加的方法 increment(state,addcounter){ state.counter += addcounter }, // 減的方法 decrement(state,subcounter){ state.counter -= subcounter } },
使用:
<template> <div> <h2>Vuex第四個頁面</h2> <button @click="addnum(5)">+</button> <button @click="subnum(5)">-</button> <p>{{$store.state.counter}}</p> </div> </template> <script> export default { name: "Vuexfour", methods:{ addnum(addcounter){ this.$store.commit("increment",addcounter) }, subnum(subcounter){ this.$store.commit("decrement",subcounter) } } } </script>
第二種方式 mapMutations
通過以函數(shù)映射的方式
1.從vuex中按需求導(dǎo)入mapMutations 函數(shù)
import {mapMutations} from 'vuex'
通過剛才導(dǎo)入的mapMutations函數(shù),將當(dāng)前組件需要的全局數(shù)據(jù),映射為當(dāng)前組件的computed計算屬性
2. 將指定的mutations函數(shù),映射為當(dāng)前組件的methods函數(shù)
methods:{ ...mapMutations(['add']) }
示例:
<script> import { mapMutations } from 'vuex' export default { computed:{ count(){ return this.$store.state.count } }, methods:{ ...mapMutations([//采用解構(gòu)的方式引入 'increment', 'decrement' ]) } } </script>
PS:Vuex中mutations的用法
Vuex中mutations的用法
在 Vuex 中 store 數(shù)據(jù)改變的唯一方法就是提交 mutations
。mutations
里面裝著一些改變數(shù)據(jù)方法的集合,這是Vuex 設(shè)計很重要的一點,就是把處理數(shù)據(jù)邏輯方法全部放在 mutations
里面,使得數(shù)據(jù)和視圖分離。
Mutations使用
Vuex 中的 mutations 非常類似于事件,每個 mutations 都有一個字符串的事件類型(type)和一個回調(diào)函數(shù)(handler),也可以理解為{type:handler()},這和訂閱發(fā)布有點類似。先注冊事件,當(dāng)觸發(fā)響應(yīng)類型的時候調(diào)用handker(),調(diào)用type的時候需要用到store.commit方法。
示例:
這個回調(diào)函數(shù)會接受state 作為第一個參數(shù):
const store = new Vuex.Store({ state: { count: 1 }, mutations: { // 事件類型 type 為 increment increment (state) { // 變更狀態(tài) state.count++ } } })
我們不能直接使用store.mutations.increment() 來調(diào)用,Vuex 規(guī)定必須使用 store.commit 來觸發(fā)對應(yīng) type 的方法:
store.commit('increment')
提交載荷(Payload)
載荷簡單的理解就是往 handler(state) 中傳參 handler(state, pryload) 。
示例:
大多數(shù)情況下,載荷是一個對象:
mutations: { // 提交荷載 increment (state, payload) { state.count += payload.amount } }
提交荷載有兩種方式:
// 把載荷和type分開提交 store.commit('increment', { amount: 10 }) // 整個對象都作為載荷傳給mutation函數(shù) store.commit({ type: 'increment', amount: 10 })
我們可以根據(jù)自己的方式來選擇使用哪種提交方式。
commit 我們可以在組件中使用 this.$store.commit(‘xxx’) 提交 mutations。
示例:
或者可以使用 mapMutations 輔助函數(shù)將組件中的 methods 映射為 store.commit 調(diào)用(需要在根節(jié)點注入 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)時,監(jiān)視狀態(tài)的 Vue 組件也會自動更新。
這也意味著 Vuex 中的 mutations 也需要與使用 Vue 一樣遵守一些注意事項,如下所示:
最好提前在 store 中初始化好所有所需屬性。
當(dāng)需要在對象上添加新屬性時,應(yīng)該使用 Vue.set(obj, ‘newProp’, 123),或者以新對象替換老對象。例如利用對象展開運算符可以寫成:state.obj = {…state.obj, newProp: 123 }。
使用常量替代 Mutations 事件類型
使用常量替代 mutations 事件類型在各種 Flux 實現(xiàn)中是很常見的模式。這樣可以使 linter 之類的工具發(fā)揮作用,同時把這些常量放在單獨的文件中可以讓你的代碼合作者對整個 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)格的計算屬性命名功能來使用一個常量作為函數(shù)名 [SOME_MUTATION] (state) { // mutate state } } })
我們知道m(xù)utation 是通過store.commit(‘increment’)的方式調(diào)用的,其中increment方法是以字符串的形式代入。如果項目小,一個人開發(fā)的話倒還好,但是項目大了,編寫代碼的人多了,那就麻煩了,因為需要 commit 的方法一多,就會顯得特別混亂,而且以字符串形式代入的話,一旦出了錯,很難排查。
所以,在需要多人協(xié)作的大型項目中,最好還是用常量的形式來處理 mutation。
必須是同步函數(shù)
我們要記住的是,Mutation 必須是同步函數(shù)。
因為我們之所以要通過提交 mutation 的方式來改變狀態(tài)數(shù)據(jù),是因為我們想要更明確地追蹤到狀態(tài)的變化。如果是類似下面這樣異步的話:
mutations: { someMutation (state) { api.callAsyncMethod(() => { state.count++ }) } }
我們就不知道什么時候狀態(tài)會發(fā)生改變,所以也就無法追蹤了,這與 Mutation 的設(shè)計初心相悖,所以強制規(guī)定它必須是同步函數(shù)。
store.commit('increment') // 任何由'increment'導(dǎo)致的狀態(tài)變更都應(yīng)該在此刻完成
需求:點擊不同的音樂列表就讓下方播放列表顯示自己點擊的列表,音樂列表是循環(huán)的
實現(xiàn)方式:就是利用vuex中的mutations。在mutations中定義一個方法,這個方法就是把點擊的index(也就是每個列表的唯一標(biāo)識),傳給state中的當(dāng)前標(biāo)識。在循環(huán)列表的頁面,把setPlayIndex方法引用過來用到頁面中,點擊不同的列表傳不同的index也就是setPlayIndex方法中的不同的value。
到此這篇關(guān)于VUEX 使用 mutations的兩種方式的文章就介紹到這了,更多相關(guān)VUEX 使用 mutations內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3 Element-plus el-menu無限級菜單組件封裝過程
對于element中提供給我們的el-menu組件最多可以實現(xiàn)三層嵌套,如果多一層數(shù)據(jù)只能自己通過變量去加一層,如果加了兩層、三層這種往往是行不通的,所以只能進行封裝,這篇文章主要介紹了Vue3 Element-plus el-menu無限級菜單組件封裝,需要的朋友可以參考下2023-04-04vue中實現(xiàn)當(dāng)前時間echarts圖表時間軸動態(tài)的數(shù)據(jù)(實例代碼)
這篇文章主要介紹了vue中實現(xiàn)當(dāng)前時間echarts圖表時間軸動態(tài)的數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10關(guān)于Vue中使用alibaba的iconfont矢量圖標(biāo)的問題
這篇文章主要介紹了Vue使用alibaba的iconfont矢量圖標(biāo)的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12談?wù)刅UE種methods watch和compute的區(qū)別和聯(lián)系
本篇文章主要介紹了談?wù)刅UE種methods watch和compute的區(qū)別和聯(lián)系,具有一定的參考價值,有興趣的可以了解一下2017-08-08探秘Vue異步更新機制中nextTick的原理與實現(xiàn)
nextTick?是?Vue?提供的一個重要工具,它的作用主要體現(xiàn)在幫助我們更好地處理異步操作,下面就跟隨小編一起來探索一下nextTick的原理與實現(xiàn)吧2024-02-02vue使用neovis操作neo4j圖形數(shù)據(jù)庫及優(yōu)缺點
這篇文章主要介紹了vue使用neovis操作neo4j圖形數(shù)據(jù)庫,本文給大家介紹了與常規(guī)做法的優(yōu)缺點對比及使用技巧,對vue?neo4j圖形數(shù)據(jù)庫相關(guān)知識感興趣的朋友一起看看吧2022-02-02