Vee Validate - Une Bibliothèque de Validation de Formulaires pour Vue.js

Vee Validate

Installation

yarn add vee-validate

ES6+

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'

import { ValidationProvider, ValidationObserver } from 'vee-validate'

import './local/vee-validate'

// Enregistrement global
Vue.component('ValidationObserver', ValidationObserver)
Vue.component('ValidationProvider', ValidationProvider)
Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

Configuration

import { extend, configure } from 'vee-validate'
import * as rules from 'vee-validate/dist/rules'
import { messages } from 'vee-validate/dist/locale/fr.json'

// Ajout d'une règle personnalisée
extend('motSecret', {
  validate: valeur => valeur === 'exemple',
  message: 'Ce n\'est pas le mot magique'
})

extend('positif', {
  validate: valeur => valeur > 0,
  message: 'Veuillez entrer une valeur supérieure à 0'
})

extend('impair', valeur => {
  return valeur % 2 !== 0
})

extend('longueurMinimale', {
  validate: (valeur, argument) => {
    return valeur.length > argument.longueur
  },
  params: ['longueur'],
  message: (nomChamp, placeholders) => {
    return `${nomChamp} doit contenir plus de ${placeholders.longueur} caractères`
  }
})

// Extension de toutes les règles existantes avec des messages français
Object.keys(rules).forEach(regle => {
  extend(regle, {
    ...rules[regle],
    message: messages[regle]
  })
})

// Configuration des classes CSS
configure({
  classes: {
    valide: 'est-valide',
    invalide: 'est-invalide',
    modifie: ['est-modifie', 'a-ete-modifie']
  }
})

Code SourceExemple 1

Utilisation des composants principaux ValidationObserver et ValidationProvider

Gestion de la soumission et réinitialisation du formulaire

<template>
  <div id="application">
    <div class="conteneur-layui">
      <validation-observer v-slot="{ soumettreForm, reinitialiser }">
        <form
          class="formulaire-layui formulaire-panneau"
          @submit.prevent="soumettreForm(envoyerFormulaire)"
          @reset.prevent="reinitialiser"
        >
          <div class="element-formulaire">
            <validation-provider rules="required|email" v-slot="{ erreurs }">
              <label class="etiquette-formulaire">Nom d'utilisateur</label>
              <div class="inline-entree">
                <input
                  type="text"
                  name="Nom d'utilisateur"
                  v-model.trim="utilisateur"
                  class="entree-layui"
                  placeholder="Veuillez entrer"
                />
              </div>
              <div class="erreur">{{ erreurs[0] }}</div>
            </validation-provider>
          </div>
          <div class="element-formulaire">
            <validation-provider rules="required" v-slot="{ erreurs }">
              <label class="etiquette-formulaire">Mot de passe</label>
              <div class="inline-entree">
                <input
                  type="password"
                  name="Mot de passe"
                  v-model="motPasse"
                  class="entree-layui"
                  placeholder="Veuillez entrer"
                />
              </div>
              <div class="erreur">{{ erreurs[0] }}</div>
            </validation-provider>
          </div>
          <div class="element-formulaire">
            <validation-provider rules="required" v-slot="{ erreurs }">
              <label class="etiquette-formulaire">Code de vérification</label>
              <div class="inline-entree">
                <input
                  type="text"
                  name="Code de vérification"
                  v-model="codeVerif"
                  class="entree-layui"
                />
              </div>
              <div
                class="milieu-formulaire svg"
                v-html="captcha"
                @click="genererCaptcha"
              ></div>
              <div class="erreur">{{ erreurs[0] }}</div>
            </validation-provider>
          </div>
          <button class="bouton-layui" :class="{ 'bouton-desactive': invalide }">
            Connexion
          </button>
          <button class="bouton-layui" type="reset">Réinitialiser</button>
          <a href="javascript:void(0)" class="lien-mdp-oublie">Mot de passe oublié</a>
        </form>
      </validation-observer>
    </div>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  name: 'application',
  data () {
    return {
      captcha: '', // Code de vérification
      utilisateur: '',
      motPasse: '',
      codeVerif: '',
      messagesErreur: [],
      invalide: false
    }
  },
  mounted () {
    this.genererCaptcha()
  },
  methods: {
    envoyerFormulaire () {
      console.log('Formulaire soumis')
    },
    genererCaptcha () {
      axios.get('http://localhost:3000/genererCaptcha').then(reponse => {
        if (reponse.status === 200) {
          if (reponse.data.code === 200) {
            this.captcha = reponse.data.donnees.svg
          }
        }
      })
    }
  }
}
</script>
<style lang="scss" scoped>
#application {
  background-color: #f2f2f2;
}
.conteneur-layui {
  background-color: #fff;
}
input {
  width: 190px;
}
.lien-mdp-oublie {
  margin-left: 10px;
  &:hover {
    color: #009688;
  }
}
.svg {
  position: relative;
  top: -15px;
}
</style>

Code SourceExemple 2

Utilisation des références ($refs)

<template>
  <div id="application">
    <div class="conteneur-layui">
      <validation-observer ref="formulaire">
        <form @submit.prevent="envoyerFormulaire">
          <div class="element-formulaire">
            <validation-provider rules="required|email" v-slot="{ erreurs }">
              <label class="etiquette-formulaire">Nom d'utilisateur</label>
              <div class="inline-entree">
                <input
                  type="text"
                  name="Nom d'utilisateur"
                  v-model.trim="utilisateur"
                  class="entree-layui"
                  placeholder="Veuillez entrer"
                />
              </div>
              <div class="erreur">{{ erreurs[0] }}</div>
            </validation-provider>
          </div>
          <div class="element-formulaire">
            <validation-provider rules="required" v-slot="{ erreurs }">
              <label class="etiquette-formulaire">Mot de passe</label>
              <div class="inline-entree">
                <input
                  type="password"
                  name="Mot de passe"
                  v-model="motPasse"
                  class="entree-layui"
                  placeholder="Veuillez entrer"
                />
              </div>
              <div class="erreur">{{ erreurs[0] }}</div>
            </validation-provider>
          </div>
          <div class="element-formulaire">
            <validation-provider rules="required" v-slot="{ erreurs }">
              <label class="etiquette-formulaire">Code de vérification</label>
              <div class="inline-entree">
                <input
                  type="text"
                  name="Code de vérification"
                  v-model="codeVerif"
                  class="entree-layui"
                />
              </div>
              <div
                class="milieu-formulaire svg"
                v-html="captcha"
                @click="genererCaptcha"
              ></div>
              <div class="erreur">{{ erreurs[0] }}</div>
            </validation-provider>
          </div>
          <button class="bouton-layui" :class="{ 'bouton-desactive': invalide }">
            Connexion
          </button>
          <a href="javascript:void(0)" class="lien-mdp-oublie">Mot de passe oublié</a>
        </form>
      </validation-observer>
    </div>
  </div>
</template>
<script>
import axios from 'axios'
export default {
  name: 'application',
  data () {
    return {
      captcha: '', // Code de vérification
      utilisateur: '',
      motPasse: '',
      codeVerif: '',
      messagesErreur: [],
      invalide: false
    }
  },
  mounted () {
    this.genererCaptcha()
  },
  methods: {
    envoyerFormulaire () {
      this.$refs.formulaire.valider().then(valide => {
        if (!valide) {
          return
        }

        this.utilisateur = ''
        this.motPasse = ''
        this.codeVerif = ''
        this.$nextTick(() => {
          this.$refs.formulaire.reinitialiser()
        })
      })
    },
    genererCaptcha () {
      axios.get('http://localhost:3000/genererCaptcha').then(reponse => {
        if (reponse.status === 200) {
          if (reponse.data.code === 200) {
            this.captcha = reponse.data.donnees.svg
          }
        }
      })
    }
  }
}
</script>
<style lang="scss" scoped>
#application {
  background-color: #f2f2f2;
}
.conteneur-layui {
  background-color: #fff;
}
input {
  width: 190px;
}
.lien-mdp-oublie {
  margin-left: 10px;
  &:hover {
    color: #009688;
  }
}
.svg {
  position: relative;
  top: -15px;
}
</style>

Code Source

Étiquettes: vuejs validation-formulaire vee-validate developpement-web composants-vue

Publié le 1 juin à 15h04