できるだけ簡単に説明するようにしています。私はこのようなものを持っています。シンプルVueルート、Vuexストア、ナビゲーションバーID内のv-modelを使用した入力。
その入力は反応しません...なぜですか?!
HTML
<div id="navbar">
<h2>@{{ test }}</h2>
<input v-model="test" />
</div>
store.js
import Vuex from 'vuex'
export const store = new Vuex.Store({
state: {
test: 'test'
},
getters: {
test (state) {
return state.test
}
}
})
Vueルート
import { store } from './app-store.js'
new Vue({
el: '#navbar',
store,
computed: {
test () {
return this.$store.getters.test
}
}
})
計算されたプロパティにバインドしています。 set計算されたプロパティの値を設定するには、get
メソッドとset
メソッドを記述する必要があります。
computed:{
test:{
get(){ return this.$store.getters.test; },
set( value ){ this.$store.commit("TEST_COMMIT", value );}
}
}
そしてあなたの店で
mutations:{
TEST_COMMIT( state, payload ){
state.test=payload;
}
}
これで、testにバインドされた入力の値を変更すると、ストアへのコミットがトリガーされ、ストアの状態が更新されます。
そのためにv-model
を使用したくありません。代わりに、入力フィールドとmethods
フックで@input="test"
を使用してください。
test(e){
this.$store.dispatch('setTest', e.target.value)
}
Vuex
ストア内:
mutations
:
setTest(state, payload){
state.test = payload
},
actions
:
setTest: (context,val) => {context.commit('setTest', val)},
これで入力がリアクティブになり、結果が@{{test}}
に表示されます。
Vuexでユーザー入力を処理する方法の例を次に示します。 http://codepen.io/anon/pen/gmROQq
私のライブラリを使用すると、Vuexでv-model
を簡単に使用できます(変更ごとにアクション/ミューテーションが発生します)。
https://github.com/yarsky-tgz/vuex-dot
<template>
<form>
<input v-model="name"/>
<input v-model="email"/>
</form>
</template>
<script>
import { takeState } from 'vuex-dot';
export default {
computed: {
...takeState('user')
.expose(['name', 'email'])
.commit('editUser') // payload example: { name: 'Peter'}
.map()
}
}
</script>
computed
プロパティは一方向です。双方向バインディングが必要な場合は、他の回答が示唆するようにセッターを作成するか、代わりにdata
プロパティを使用してください。
import { store } from './app-store.js'
new Vue({
el: '#navbar',
store,
// computed: {
// test() {
// return this.$store.getters.test;
// }
// }
data: function() {
return { test: this.$store.getters.test };
}
});
ただし、入力値を検証するにはセッターの方が適しています。