Skip to content
On this page

Componente ErrorMessage

Ya hemos construidos los componentes de formularios de mayor complejidad. Sin embargo, hay otros más simples pero no menos importantes como AppErrorMessage y AppButton.

AppErrorMessage

Vamos a crear el archivo AppErrorMessage.vue en la carpeta components y copiaremos dentro de la sección template la parte del código del componente AppInput.vue que renderiza el mensaje de error.

vue
<template>
  <p
    v-if="error"
    class="errorMessage"
    :id="`${uuid}-error`"
    aria-live="assertive"
  >
    {{ error }}
  </p>
</template>

Empezaremos borrando la condición v-if porque que no la necesitamos aquí. Esta condición es potestá exclusiva del elemento padre AppInput. Tambien remplazaremos la interpolación error por un <slot />.

html
<p    
  class="errorMessage"
  :id="`${uuid}-error`"
  aria-live="assertive"
>
  <slot />
</p>

Avancemos estableciendo la propiedad id injectada como required desde el componente padre. Ahora, ya tenemos listo nuestro componente AppErrorMessage.vue

vue
<script setup lang="ts">
defineProps<{
  id: string | number  
}>()
</script>

<template>
  <p    
    class="errorMessage"
    :id="id"
    aria-live="assertive"
  >
    <slot />
  </p>
</template>

Finalmente solo nos falta remplazar, en el componente padre, el correspondiente código por el <AppErrorMessage />

📃AppInput.vue

vue
<script setup lang="ts">
  // omitted for brevity ...
</script>

<template>
  <label :for="uuid" v-if="label">{{ label }}</label>
  <input
    v-bind="$attrs"
    :value="modelValue"
    :placeholder="label"
    @input="$emit(
      'update:modelValue',
      ($event.target as HTMLInputElement).value
    )"
    class="field"
    :id="uuid"
    :aria-describedby="error ? `${uuid}-error` : undefined"
    :aria-invalid="error ? true : undefined"
  >
  <AppErrorMessage
    v-if="error"
    :id="`${uuid}-error`"
  >
    {{ error }}
  </AppErrorMessage>
</template>

Solo nos falta declarar AppErrorMessage.vue como complemento global para que esto funcione.

Componente Button

El AppButton.vue es más fácil aún, solo tenemos que crear el siguiente archivo. Tome en cuenta que cualquier atributo que reciba este componente será inyectado al elemento <button>.

📃AppButton.vue

vue
<template>
  <button class="button">
    <slot/>
  </button>
</template>

Y listo, ya podemos volver a nuestro TasksForm.vue y reemplazar el elemento <button> con nuestro nuevo componente AppButton.

📃TasksForm.vue

html
<AppButton
  class="btn btn-primary"
  type="submit"
>
  Submit
</AppButton>

Recuerde declarar AppButton.vue como complemento global.

Terminando

!! En enhorabuena y parabién hemos llegado al final de este tutorial !!

Nos despedimos, no sin antes invitarle a disfrutar del Bonus que hemos preparado especialmente para ti...