J'ai un composant avec une validation de formulaire. C'est un formulaire de paiement en plusieurs étapes. Le code ci-dessous est pour la première étape. Je voudrais valider que l'utilisateur a saisi du texte, stocker son nom dans l'état global, puis l'envoyer à l'étape suivante. J'utilise vee-validate et vuex
<template>
<div>
<div class='field'>
<label class='label' for='name'>Name</label>
<div class="control has-icons-right">
<input name="name" v-model="name" v-validate="'required|alpha'" :class="{'input': true, 'is-danger': errors.has('name') }" type="text" placeholder="First and Last">
<span class="icon is-small is-right" v-if="errors.has('name')">
<i class="fa fa-warning"></i>
</span>
</div>
<p class="help is-danger" v-show="errors.has('name')">{{ errors.first('name') }}</p>
</div>
<div class="field pull-right">
<button class="button is-medium is-primary" type="submit" @click.prevent="NeXTSTEP">Next Step</button>
</div>
</div>
</template>
<script>
export default {
methods: {
NeXTSTEP(){
var self = this;
// from baianat/vee-validate
this.$validator.validateAll().then((result) => {
if (result) {
this.$store.dispatch('addContactInfoForOrder', self);
this.$store.dispatch('goToNextStep');
return;
}
});
}
},
computed: {
name: function(){
return this.$store.state.name;
}
}
}
</script>
J'ai un magasin pour gérer l'état de la commande et enregistrer le nom. En fin de compte, je voudrais envoyer toutes les informations du formulaire multi-étape au serveur.
export default {
state: {
name: '',
},
mutations: {
UPDATE_ORDER_CONTACT(state, payload){
state.name = payload.name;
}
},
actions: {
addContactInfoForOrder({commit}, payload) {
commit('UPDATE_ORDER_CONTACT', payload);
}
}
}
Quand je lance ce code, j'obtiens une erreur qui Computed property "name" was assigned to but it has no setter.
Comment lier la valeur du champ de nom à l'état global? Je voudrais que cela soit persistant de sorte que même si un utilisateur recule d'une étape (après avoir cliqué sur "Étape suivante"), il verra le nom qu'il a saisi à cette étape.
Si vous voulez calculer v-model
, il faut un setter . Quoi que vous souhaitiez faire avec la valeur mise à jour (écrivez-la probablement dans le $store
, en considérant que c'est ce que votre getter tire de celle-ci) que vous faites dans le setter.
Si vous le réécrivez dans le magasin via la soumission du formulaire, vous ne voulez pas v-model
, vous voulez simplement définir :value
.
Si vous voulez avoir un état intermédiaire, où il est enregistré quelque part mais n'écrase pas la source dans le $store
jusqu'à la soumission du formulaire, vous devez créer un tel élément de données.
Pour moi, ça changeait.
this.name = response.data;
A quoi calcule le retour alors;
this.$store.state.name = response.data;
`
computed: {
isSubmitAttemped() {
return Object.keys(this.fields).every(field => {
return this.fields[field] && this.fields[field].valid;
});
}
}
<button class="btn btn-warning btn-block" v-bind:disabled="!isSubmitAttemped" >Login</button>
`