recherche

Maison  >  Questions et réponses  >  le corps du texte

VueJS 3 : Activer le bouton lorsque la condition est remplie

Je travaille actuellement sur un formulaire et je rencontre quelques problèmes pour activer le bouton lorsqu'une condition est remplie.

Actuellement, j'ai créé un formulaire avec des entrées pour le nom, le numéro de téléphone, certaines options et un message. Lorsque la condition est remplie, je souhaite activer le bouton que j'ai désactivé.

Est-ce que quelqu'un sait comment réactiver le bouton pour soumettre le formulaire ?

<template>

    <div class="contact">
  <h1>Vi uppskattar alla frågor som du har angående denna applikation!</h1>
  <h2> Vänligen skriv ett meddelande här nedan så ska vi göra allt vi kan för att svara så snart som möjligt!</h2>
</div>

  <form @submit.prevent="submitForm">
    <div class="form-control" :class="{invalid: fullNameValidation === 'invalid'}">
      <label for="name">Namn</label>
      <input id="name" name="name" type="text" v-model="fullName" @blur="validateInput">
      <p v-if="fullNameValidation === 'invalid'">Vänligen fyll i ett namn</p>
    </div>
    <div class="form-control" :class="{invalid: phoneValidation === 'invalid'}">
      <label for="phone">Telefonnummer</label>
      <input id="phone" name="phone" type="number" v-model="phoneNr" @blur="validatePhone" pattern="[0-9]*">
      <p v-if="phoneValidation === 'invalid'">Vänligen fyll i ett giltigt telefonnummer</p>
    </div>
    <div class="form-control">
      <label for="referrer">Hur fick du kännedom av denna applikation?</label>
      <select id="referrer" name="referrer" v-model="referrer">
        <option value="" disabled hidden>Välj ett alternativ</option>
        <option value="internet">Internet</option>
        <option value="friends">Vänner</option>
        <option value="newspaper">Nyhetstidningar</option>
        <option value="other">Annat</option>
      </select>
    </div>
    <div class="form-control" :class="{invalid: messageValidation === 'invalid'}">
      <label for="message">Meddelande</label>
      <textarea name="message" id="message" cols="30" rows="10" v-model="message" @blur="validateMessage"></textarea>
       <p v-if="messageValidation === 'invalid'">Vänligen fyll i ditt meddelande</p>
    </div>

    <div>
      <button v-on:click="$router.push('thankyou')" :disabled="!isComplete" id="myBtn">Skicka meddelande</button>
    </div>
  </form>
</template>

<script>
export default {
    data() {
        return {
            fullName: '',
            fullNameValidation: 'pending',
            phoneNr: 'null',
            phoneValidation: 'pending',
            referrer: '',
            messageValidation: 'pending'
        }
    },

    methods: {
        submitForm() {
            this.fullName = '';
        },
        validateInput() {
            if (this.fullName === '') {
                this.fullNameValidation = 'valid'
            } else {
                this.fullNameValidation = 'invalid'
            }
        },
        validatePhone() {
            if (this.phoneNr > 10) {
                this.phoneValidation = 'valid'
            } else {
                this.phoneValidation = 'invalid'
            }
        },
         validateMessage() {
            if (this.messageValidation > 1) {
                this.messageValidation = 'valid'
            } else {
                this.messageValidation = 'invalid'
            }
        },

        computed: {
       isComplete() {
          return Object.values(this.fields).every(({valid}) => valid)
      }
  }
    }
}
</script>

P粉258788831P粉258788831277 Il y a quelques jours410

répondre à tous(1)je répondrai

  • P粉278379495

    P粉2783794952024-02-22 11:55:36

    Fusionnez les champs du formulaire en un seul modèle avec les objets d'erreur.

    Ensuite, utilisez Object.keys pour obtenir les clés de champ connues pour la validation.

    export default {
      data() {
        return {
          form: {
            errors: {},
            values: {
              fullName: '',
              phoneNr: '',
              referrer: '',
            }
          }
        }
      },
      methods: {
        validate(field) {
    
          let fields = []
          // single field
          if (field) {
            delete this.form.errors[field]
            fields.push(field)
          } else {
            this.form.errors = {}
            // all fields
            fields = Object.keys(this.form.values)
          }
    
    
          if (fields.includes('fullName')) {
            if (this.form.values.fullName === '') {
              this.form.errors.fullName = 'Enter your full name'
            } else if (this.fullName !== some other validation) {
              ...
            }
          }
    
          if (fields.includes('phoneNr')) {
            if (this.form.values.phoneNr === '') {
              this.form.errors.phoneNr = 'Enter your phone number'
            }
          }
    
          if (fields.includes('referrer')) {
            if (this.form.values.referrer === '') {
              this.form.errors.referrer = 'Enter referrer'
            }
          }
    
          // if errors is empty return true
          return !Object.keys(this.form.errors).length
        },
        submit() {
          // validate all
          if (this.validate()) {
            // do some thing, form is valid, if native form handler, return true/false
          }
        }
      }
    }

    {{ form.errors.fullName }}

    Si vous n'avez pas spécifiquement besoin de @blur validation, cela simplifie beaucoup les choses et il est assez standard de valider lors de la soumission au lieu de masquer les champs individuels.

    export default {
      data() {
        return {
          form: {
            errors: {},
            values: {
              fullName: '',
              phoneNr: '',
              referrer: '',
            }
          }
        }
      },
      methods: {
        validate() {
    
          this.form.errors = {}
    
          if (this.form.values.fullName === '') {
            this.form.errors.fullName = 'Enter your full name'
          } else if (this.form.values.fullName !== some other validation) {
            ...
          }
    
          if (this.form.values.phoneNr === '') {
            this.form.errors.phoneNr = 'Enter your phone number'
          }
    
    
          if (this.form.values.referrer === '') {
            this.form.errors.referrer = 'Enter referrer'
          }
    
    
          // if errors is empty return true
          return !Object.keys(this.form.errors).length
        },
        submit() {
          if (this.validate()) {
            // do something, form is valid, if native form handler, return true/false
          }
        }
      }
    }

    {{ form.errors.fullName }}

    répondre
    0
  • Annulerrépondre