Дочерние компоненты проверки форм Vue 3

#forms #validation #components #parent-child #vuejs3

Вопрос:

Я изучаю Vue 3 (API композиции) и застрял на пошаговой проверке формы с родительско-дочерними компонентами. Я понятия не имею, как я могу легко проверить ввод на дочернем компоненте, выдать ошибку родительскому компоненту и избежать перехода пользователя к следующему шагу с отображением ошибок

Родитель

 <form @submit.prevent="submitForm" class="tab-content py-6 ">
  <template v-if="currentStep == 0">
    <Step1 v-model:TYPE="TYPE" />

    <div class="nav row align-items-center">
      <div class="col-auto">
        <button v-show="currentStep > 0" @click="Previous" class="btn btn-lg btn-white" >Previous</button>
      </div>
      <div class="col text-center">
      </div>
      <div class="col-auto">
        <a @click="Next" class="btn btn-lg btn-primary" >Next</a>
      </div>
    </div>

  </template>
  <template v-if="currentStep == 1">
    <Step2 
      v-model:first_name="first_name" 
      v-model:last_name="last_name" />

    <div class="nav row align-items-center">
      <div class="col-auto">
        <button v-show="currentStep > 0" @click="Previous" class="btn btn-lg btn-white" >Previous</button>
      </div>
      <div class="col text-center">
      </div>
      <div class="col-auto">
        <a @click="handleSubmit" class="btn btn-lg btn-primary" >Submit</a>
      </div>
    </div>
    
  </template>
</form>
 

Ребенок: Шаг 1.vue

     <div class="form-check">
        <input class="form-check-input" type="radio" name="flexRadioDefault" id="Student" value="Student" 
        v-model="TYPE"
        @input="$emit('update:TYPE', $event.target.value)"
        >
        <label class="form-check-label" for="prospect">
        Student
        </label>
    </div>

    <div class="form-check">
        <input class="form-check-input" type="radio" name="flexRadioDefault" id="Teacher" value="Teacher" 
        v-model="TYPE"
        @input="$emit('update:TYPE', $event.target.value)"
        >
        <label class="form-check-label" for="Teacher">
        Teacher
        </label>
    </div>

// Add validation here => If no selection is made, do not go to step 2
 

Ребенок: Шаг 2.vue

     <div class="form-group">
        <label class="form-label">
        first Name
        </label>
        <input v-model="first_name" type="text" class="form-control" 
        @input="$emit('update:first_name', $event.target.value)"
        >
    </div>
    <div class="form-group">
        <label class="form-label">
        last Name
        </label>
        <input v-model="last_name" type="text" class="form-control" 
        @input="$emit('update:last_name', $event.target.value)"
        >
    </div>

// Add validation here => If first Name or last Name is empty, do not send the form