Using Vuelidate in components

Published: 2021-06-17

Vuelidate в компонентах

Зазвичай всі приклади використання ліби є суперпримітивними

<template>
  <div
    :class="[
      'base-input',
      modifier && `base-input--${modifier}`,
      v &&
        v.$params.required &&
        v.$params.required.type === 'required' &&
        'base-input--required',
    ]"
  >
    <label v-if="label" class="base-input__label" :for="id" v-text="label" />
    <input
      @change="updateValue($event.target.value)"
      :type="type"
      :placeholder="placeholder"
      :class="['base-input__input']"
      :id="id"
      :value="value"
    />
    <template v-if="v">
      <span class="error" v-if="v.$params.required && !v.required && v.$dirty">
        Пожалуйста, заполните поле!
      </span>
      <span class="error" v-if="type === 'email' && !v.email && v.$dirty">
        Пожалуйста, введите корректный email!
      </span>
    </template>
  </div>
</template>
<script>
export default {
  props: {
    type: {
      type: String,
      default: 'text',
    },
    label: {
      type: String,
      required: false,
    },
    placeholder: {
      type: String,
      required: true,
    },
    id: {
      type: String,
      required: true,
    },
    value: {
      type: String,
      default: '',
    },
    v: {
      type: Object,
      required: false,
    },
    modifier: {
      type: String,
    },
  },
  methods: {
    updateValue(value) {
      this.v && this.v.$touch()
      this.$emit('input', value)
    },
  },
}
</script>