冗長なmutationsがスプレッド構文でスッキリした件

Vue.jsとVuexを使ってマルチステップの申し込みフォームを作っています。
ユーザーが入力する情報は、性別や生年月日など8項目。

8項目それぞれに対してmutationsで処理を作っていましたが、完成したらそれはそれは冗長なコードになってしまったので、なんとかスッキリさせようと調べた結果、スプレッド構文を使ったら劇的ビフォーアフターしました。

storeとv-modelをうまく使い方ときに参考になるかと。

ビフォー(元のコードの一部抜粋)

//store.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
   state: {
       user: {
           gender: '',
           year: '',
           month: '',
          //...以下略
       }
   },
   getters: {
       gender: state => state.user.gender,
       year: state => state.user.year,
       month: state => state.user.month,
       day: state => state.user.day,
       //...以下略    
   },
   mutations: {
       userGender(state, gender) {
           state.user.gender = gender;
       },
       userYear(state, year) {
           state.user.year = year;
       },
       userMonth(state, month) {
           state.user.month = month;
       },
       //...以下略
   },
}); 
//Info.vue
<template>
   <div>
       // 略 // 
   </div>
</template>
<script>
import { mapMutations } from 'vuex';
export default {
   computed: {
       gender: {
           get() {
               return this.$store.getters.gender;
           },
           set(value) {
               this.$store.commit('userGender', value)
           },
       },
       year: {
           get() {
               return this.$store.getters.year;
           },
           set(value) {
               this.$store.commit('userYear', value)
           },
       },
       month: {
           get() {
               return this.$store.getters.month;
           },
           set(value) {
               this.$store.commit('userMonth', value)
           },
       },
       day: {
           get() {
               return this.$store.getters.day;
           },
           set(value) {
               this.$store.commit('userDay', value)
           },
       },
   },
   methods: {
       ...mapMutations(['userGender', 'userYear', 'userMonth', 'userDay']),
   },
};

とにかく冗長。

アフター(なんということでしょう)

//store.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
   state: {
       user: {}   //①keyとvalueはcomponentのdataから持ってくるこれる
   },
   //②不要なgettersは削除する。
   mutations: {
       setUser(state, userDetail) {
           state.user = {...state.user, ...userDetail}
       }, //③スプレット構文を用いてオブジェクトを展開して結合させる。
   },
});
//Info.vue
<template>
   <div>
      // 略 //
   </div>
</template>
<script>
export default {
   data: function() {
       return {
           user: {
               gender: '',
               year: '',
               month: '',
               day: '',
           },
       }
   },
   created: function() {
       this.getDays();
   },
   methods: {
       setUser: function() {
           this.$store.commit('setUser',this.user)
       },
       getDays: function() {
           this.daysMax = new Date(this.user.year, this.user.month, 0).getDate();
       },
   },
};
</script>

ポイントはコメントアウトしている3つ
①stateを空のオブジェクトにして、代わりにコンポーネントにdataとしてオブジェクトを用意しておく。
②gettersは必ずしも必要なわけではなかった。
③スプレッド構文を用いてオブジェクトを統合することで、①を行った利点も活かせる。
といった所でした。

参考にした記事はコチラ。
JSのスプレッド構文を理解する
Vuexと入力フォーム

この記事が気に入ったらサポートをしてみませんか?