Je crée un formulaire en utilisant vue.js et je dois créer des entrées en vue toujours en majuscules. Je sais que je pourrais utiliser la propriété css
text-transform: uppercase;
puis transformez les données avant l'envoi en utilisant
data.someData.toUpperCase()
Mais je me demande s'il existe une manière plus intelligente de faire cela dans vue.js. En réaction, nous pouvons créer des entrées contrôlées et le faire facilement. Y a-t-il quelque chose comme ça dans Vue.js?
J'ai réussi à le faire en utilisant des champs calculés, cependant, je devrais créer un getter et un setter calculés pour chaque entrée du formulaire. Y a-t-il une meilleure façon de le faire?
4 Réponses :
Vous pouvez créer une directive personnalisée.
<input type="text" v-model="modelfield" v-touppercase>
Et puis utilisez-le là où vous en avez besoin. Par exemple:
Vue.directive( 'touppercase', { update (el) { el.value = el.value.toUpperCase() }, })
Cela fonctionne, mais il envoie le mot avec la dernière lettre en minuscule au serveur ...
cela ne fonctionne pas, car le dernier caractère est en minuscule.
Comme vous n'avez pas beaucoup de code à exécuter, vous devez lier manuellement les événements à votre champ de texte, puis gérer les majuscules à cet endroit.
La gestion des événements à partir d'un champ de texte peut être effectuée en y ajoutant un gestionnaire d'événements d' input
, puis en mettant à nouveau à jour l'état initial.
<input :value="text" @input="text = $event.target.value.toUpperCase()"/>
Vous pouvez également le faire en ligne dans un modèle, mais cela peut rendre la lecture plus difficile en fonction de vos préférences de style de code
<input :value="text" @input="updateText($event.target.value)"/> export default { data() { return { text: '', } }, methods: { updateText(newValue) { this.value = newValue.toUpperCase(); }, } }
Je devrais encore créer une méthode pour chaque champ unique du formulaire.
@IanPierreGomes J'ai ajouté une variante qui montre le code sur une seule ligne
Cette directive fonctionne bien avec v-model
(le dernier caractère est également en majuscules):
<input type="text" v-model="myField" v-uppercase />
Usage:
Vue.directive('uppercase', { update(el) { const sourceValue = el.value; const newValue = sourceValue.toUpperCase(); if (sourceValue !== newValue) { el.value = newValue; el.dispatchEvent(new Event('input', { bubbles: true })); } }, });
Tu peux le faire:
<input :value="theValue" @input="theValue = theValue.toUpperCase()"/>
Vous devriez jeter un œil aux propriétés
computed
. vuejs.org/v2/guide/computed.htmlMerci Monsieur. C'était rapide.
Je l'ai posté comme réponse
Cependant, je dois créer un getter et un setter calculés pour chaque champ. Je pensais qu'il y avait un moyen de le faire une seule fois pour chaque entrée.