0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Vue.js】Vuexを使ったとき、フォームでv-modelを使うと不具合が出る問題の対処

Posted at

はじめに

Vuexを使って状態管理すると、フォーム入力でv-modelを使うと、
「ちょっと!勝手にstate変えずにちゃんとmutation通してくれるかな:weary:
と怒られる問題があります。

自分はこれに対してどうするのがベストか分からず、試行錯誤を繰り返していました。

そんな時に、手間がかからずラクな方法こちらのブログで発見したので、メモしておきます。

環境

OS: macOS Catalina 10.15.3
Vue: 2.6.10
vuex: 3.1.2

前提

ユーザー情報を入力するフォームがあったとします。

今回はシンプルな例にするため、そのユーザー情報の中でもnameを入力する<input>タグを例にします。

v-modelを使った場合

sample.vue
<template>
<!-- 略 -->
  <input v-model="user.name" >
<!-- 略 -->
</template>

シンプルにこれでOKです。

が、Vuexを使ってこのuserの情報を管理している場合は冒頭の
「ちょっと!勝手にstate変えずにちゃんとmutation通してくれるかな:weary:
と怒られる問題が発生します。

これを大した手間をかけずに解決する方法が以下です。

改善後

<input>タグ内

sample.vue
<template>
<!-- 略 -->
  <input
    :value="user.name"
    @input="updateUser($event, 'name')"
  >
<!-- 略 -->
</template>

ここで<input>タグ内のinputイベントで次のupdateUserメソッドが発火、このときのDOMイベントが$eventに入ります。

<input>タグのあるコンポーネントのmethods

sample.vue
<script>
//略
  export default {
//略
    methods: {
      updateUser(event, key_name) {
        this.$store.commit('updateUserState', { 
      value: event.target.value, key_name });
      }
    }
  }
//略
</script>

先程のDOMイベントから入力された文字列valueを抜き出し、key-nameと共に以下Vuexストア内mutationsで定義されたupdateUserState()の引数として渡します。

Vuexストア内

store.js
export default ({
//略
  mutations: {
    updateUserState (state, { value, key_name }) {
      state.user[key_name] = value;
    }
  }
//略
})

最後に、このupdateUserState()でストアのuserの値を変更し、ストア内と<input>タグ内に入力された文字列が同じになります。

以上です!
使い回しやすいコードで超助かりました:relaxed:

おわりに

最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

参考にさせて頂いたサイト(いつもありがとうございます)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?