フォームの扱い
厳格モードで Vuex を使用するとき、Vuex に属する状態の一部で v-model
を使用するのは少しトリッキーです:
<input v-model="obj.message">
obj
がストアからオブジェクトを返す算出プロパティ (computed property) と仮定すると、v-model
は input でユーザーが入力するとき、直接 obj.message
を変更します。厳格モードでは、この変更は明示的に Vuex のミューテーションハンドラ内部で処理されていないため、エラーを投げます。
それに対処するための "Vuex way" は、<input>
の値をバインディングし、input
または change
イベントでアクションを呼び出すことです:
<input :value="message" @input="updateMessage">
// ...
computed: {
...mapState({
message: state => state.obj.message
})
},
methods: {
updateMessage (e) {
this.$store.commit('updateMessage', e.target.value)
}
}
ミューテーションのハンドラは以下のようになります:
// ...
mutations: {
updateMessage (state, message) {
state.obj.message = message
}
}
双方向算出プロパティ
確かに、上記の例は単純な v-model
と ローカルステートよりもかなり冗長で、v-model
のいくつかの有用な機能が使えません。代わりに、セッターで双方向算出プロパティを使うアプローチがあります。
<input v-model="message">
computed: {
message: {
get () {
return this.$store.state.obj.message
},
set (value) {
this.$store.commit('updateMessage', value)
}
}
}