Gestion des formulaires
Lorsque l'on utilise Vuex en mode strict, il peut être compliqué d'utiliser v-model
sur une partie de l'état qui appartient à Vuex :
<input v-model="obj.message">
Supposons que obj
est une propriété calculée qui retourne un objet depuis le store, le v-model
tentera de muter directement obj.message
lorsque l'utilisateur saisit du texte dans le champ. En mode strict, cela produira une erreur car la mutation n'est pas effectuée dans un gestionnaire de mutation Vuex explicite.
La « méthode Vuex » pour gérer ça est de lier la valeur de l'input
et d'appeler une action sur l'évènement input
ou change
:
<input :value="message" @input="updateMessage">
// ...
computed: {
...mapState({
message: state => state.obj.message
})
},
methods: {
updateMessage (e) {
this.$store.commit('updateMessage', e.target.value)
}
}
Et voici le gestionnaire de mutation :
// ...
mutations: {
updateMessage (state, message) {
state.obj.message = message
}
}
Propriété calculée bidirectionnelle
Admettons tout de même que l'exemple ci-dessus est plus verbeux que le v-model
couplé à l'état local (tout en perdant quelques fonctionnalités pratiques de v-model
au passage). Une approche alternative consiste à utiliser une propriété calculée bidirectionnelle avec un mutateur :
<input v-model="message">
// ...
computed: {
message: {
get () {
return this.$store.state.obj.message
},
set (value) {
this.$store.commit('updateMessage', value)
}
}
}