首頁 > 軟體

Vue中mapMutations傳遞引數方式

2022-04-12 13:00:19

通過子元件定義的方法傳遞引數

在…mapMutations參照

不多逼逼,看程式碼!

store檔案中:

import Vuex from 'vuex';
import Vue from 'vue';
Vue.use(Vuex);
let store = new Vuex.Store({
    state: {
        name: 'hahahah',
        age: '19',
    },
    mutations: {
        changeName(state, params) {
            console.log(params);
            state.name = params.name 
        },
        changeAge(state, params) {
            state.age = params.age
        }
    },
})
export default store

VueDemo中:

<template>
  <div>
    <h4>這裡是son1元件</h4>
    name:{{name}}
    age:{{age}}
    <button @click="hehe">改名字</button>
  </div>
</template>
<script>
import { mapState, mapMutations } from "vuex";
export default {
  data() {
    return {
      list: {
        name: "6666"
      }
    };
  },
  computed: {
    ...mapState(["name", "age"])
  },
  methods: {
    hehe() {
      this.changeName(this.list);
    },
    ...mapMutations(["changeName"])
  }
};
</script>
<style>
</style>

當然也可以寫直接傳遞

state.age = params
<button @click="changeName(555555)">改名字</button>

省略data傳參

...mapMutations(["changeName"])

關於mapMutations的作用

mapMutations工具函數會將store中的commit方法對映到元件的methods中。和mapActions的功能幾乎一樣,我們來直接看它的實現:

export function mapMutations (mutations) {
    const res = {}
    normalizeMap(mutations).forEach(({ key, val }) => {
        res[key] = function mappedMutation (...args) {
            return this.$store.commit.apply(this.$store, [val].concat(args))
        }
    })
    return res
}

函數的實現幾乎也和 mapActions 一樣,唯一差別就是對映的是 store 的 commit 方法。為了更直觀地理解,我們來看一個簡單的例子:

import { mapMutations } from 'vuex'
export default {
    // ...
    methods: {
        ...mapMutations([
            'increment' // 對映 this.increment() 到 this.$store.commit('increment')
        ]),
        ...mapMutations({
            add: 'increment' // 對映 this.add() 到 this.$store.commit('increment')
        })
    }
}

經過mapMutations函數呼叫後的結果,如下所示:

import { mapActions } from 'vuex'
export default {
    // ...
    methods: {
        increment(...args) {
            return this.$store.commit.apply(this.$store, ['increment'].concat(args))
        }
        add(...args) {
            return this.$store.commit.apply(this.$store, ['increment'].concat(args))
        }
    }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。 


IT145.com E-mail:sddin#qq.com