# フォームのハンドリング 厳格モードで Vuex を使用するとき、Vuex に属するステートの一部において `v-model` を使用するのは少しトリッキーです: ``` html ``` `obj` がストアからオブジェクトを返す算出プロパティ (computed property) と仮定すると、`v-model` はここでは、input でユーザーがタイプするとき、直接 `obj.message` を変更させようとします。厳格モードにおいて、この変更は明示的に Vuex のミューテーションハンドラ内部で処理されていないため、エラーを投げます。 それに対処するための "Vuex way" は、`` の値をバインディングし、そして `input` または `change` イベントでアクションを呼び出します: ``` html ``` ``` js // ... vuex: { getters: { message: state => state.obj.message }, actions: { updateMessage: ({ dispatch }, e) => { dispatch('UPDATE_MESSAGE', e.target.value) } } } ``` ミューテーションのハンドラは以下のようになります: ``` js // ... mutations: { UPDATE_MESSAGE (state, message) { state.obj.message = message } } ``` 確かに、これは単純な `v-model` よりもかなり冗長ですが、これは、ステートの変化を明示的で追跡可能にするためのコストです。同時に、 Vuex ストア内部に全てのステートを置く必要はないということに注意してください。フォームのインタラクションの全てにおいて、ミューテーションの追跡を望まない場合は、単純にコンポーネントのローカルステートとして Vuex の外部にフォームのステートを保つことができ、これは自由に `v-model` を活用することができます。 `v-model` を Vuex ストア内のステートに対して活用するための代わりのアプローチとして、コンポーネントの算出プロパティのセッターを使う方法があります。このアプローチでは lazy、number、debounce といったすべてのパラメータ属性の利点を享受することができます。 ``` html ``` ``` js // ... vuex: { getters: { message: state => state.obj.message }, actions: { updateMessage: ({ dispatch }, value) => { dispatch('UPDATE_MESSAGE', value) } } }, computed: { thisMessage: { get () { return this.message }, set (val) { this.updateMessage(val) } } } ``` ミューテーションには変更はありません。