Как создать геттеры и сеттеры для состояния модуля пространства имен vuex
Если у меня есть модуль Vuex с пространством имен, как создать методы получения и установки для состояний в этом модуле при использовании этих состояний в компонентах Vue?
// My component
new Vue({
computed: {
// How do I add setters also below????
...mapState('nameSpacedModA', {
a : state => state.a,
// ...
},
// Following will only add getters..
// How to add setter ???
...mapGetters('nameSpacedModA', {
a: 'a',
b: 'b' //, ...
}
}
Я привязываю 'a' к текстовому вводу в форме, используя v-модель, а затем, когда я редактирую значение элемента управления, Vue выдает ошибку:
[Vue warn]: вычисленное свойство "a" было назначено, но оно не имеет установщика.
Как это решить?
2 ответа
Если вы хотите сделать связывание двумя способами, вам нужно определить и получатель, и установщик в вычисляемых свойствах. (Не забудьте определить мутацию updateA
)
<input v-model="a">
// ...
computed: {
a: {
get () {
return this.$store.state.a
},
set (value) {
this.$store.commit('updateA', value)
}
}
}
Другой вариант использует mapFields
Я нашел другой способ с помощью помощников Vuex mapStates и mapActions. Это немного более многословно. Таким образом, использование подхода привязки v-модели лучше.
// Кстати: если вы используете подход, предложенный ittus
тогда вы будете использовать привязку v-модели, как показано ниже:
<input v-model="a" />
// Используя другой подход, который я использовал, вам придется выполнить двустороннее связывание, как показано ниже:
<input :value="a" @input="updateA" />
Если вы хотите использовать привязку v-модели, тогда код будет примерно таким:
// Vuex store
....
modules: {ModuleA, ...}
// ModuleA of store
export default {
namespaced: true,
states: {
a: '',
},
mutations: {
updateA: (state, value) => state.a = value
},
actions: {
updateA(context, value) { context.commit('updateA', value) }
}
}
// Then in your Component you will bind this Vuex module state as below
new Vue({
store,
computed: {
a: {
get() { this.$store.state.ModuleA.a; }
set(value) {this.updateA(value);}
},
},
methods: {
...mapActions('MyModule', [ updateA ]),
}
})