Поиск по сайту:

Как добавить двустороннюю привязку данных к пользовательским компонентам в Vue.js


Введение

В этой статье вы узнаете, как добавить директиву v-model для пользовательских компонентов в Vue.js. Хотя директива v-model является мощным инструментом для добавления двусторонней привязки данных в ванильные компоненты Vue.js, поддержка пользовательских компонентов не так развита.

Предпосылки

Понимание двусторонней привязки данных в Vue.js рекомендуется, но не обязательно. Чтобы узнать больше о двусторонней привязке данных, ознакомьтесь с нашим руководством по использованию v-model для двусторонней привязки в Vue.js.

Реализация директивы v-model

Чтобы понять, как реализовать поддержку v-model в ваших компонентах, вам нужно понять, как это работает внутри. Значение v-model=prop является сокращением для :value=prop @input=prop=arguments\[0\].

Таким образом, чтобы сделать ваш компонент совместимым с директивой v-model, он должен принимать атрибуты :value и @input для добавления и отправки значение, когда пользователь взаимодействует с вашим приложением Vue.js.

В файле DatePicker.vue создайте пользовательский компонент, который принимает значения месяца и года в объекте. Атрибуты :value и @input будут представлять значения, на которые ссылается ваш компонент. Установите шаблон с входными данными для значений month и year:

<template>
  <div class="date-picker">
    Month: <input type="number" ref="month-picker" :value="value.month" @input="updateDate()"/>
    Year: <input type="number" ref="year-picker" :value="value.year" @input="updateDate()"/>
  </div>
</template>

<script>
export default {
  props: ['value'],

  methods: {
    updateDate() {
      this.$emit('input', {
        month: +this.$refs.monthPicker.value,
        year: +this.$refs.yearPicker.value
      })
    }
  }
};
</script>

В теге script ваш пользовательский метод updateDate() применяет общедоступное свойство экземпляра .$emit() для обновления значений в месяц и год в зависимости от ввода пользователя.

Чтобы использовать пользовательский компонент в других файлах Vue.js, установите директиву v-model для привязки и добавления значений из ваших свойств month и year. в файле WrapperComponent.vue:

<template>
  <div class="wrapper">
    <date-picker v-model="date-picker"></date-picker>
    <p>
      Month: {{date.month}}
      Year: {{date.year}}
    </p>
  </div>
</template>

В теге script импортируйте свой пользовательский компонент и вставьте его в свойство components. Это задействует функциональность, содержащуюся в вашем компоненте DatePicker, в вашем файле WrapperComponent.vue:

<script>
import DatePicker from './DatePicker.vue';

export default {
  components: {
    DatePicker
  },

  data() {
    return {
      date: {
        month: 1,
        year: 2017
      }
    }
  }
})
</script>

Модель data() сохраняет и возвращает значения ваших свойств month и year.

Чтобы проверить, двусторонняя привязка с пользовательскими компонентами требует, чтобы атрибуты :value и @input добавляли и выдавали обновленную дату в одном вызове.

Практика v-модели в Advanced Components

Используя одно или несколько вычисляемых свойств, вы можете интегрировать данные, такие как строки, во входной формат, которым могут управлять элементы. Это часто используется с расширенными пользовательскими компонентами, которые обрабатывают множество потенциальных входных форматов.

В файле StringDatePicker.vue создайте пользовательский компонент, который передает строку со структурой m/yyyy. Установите атрибуты :value и @input в свои входные данные, чтобы принимать и обновлять значения из вашего пользовательского компонента:

<template>
  <div class="date-picker">
    Month: <input type="number" ref="monthPicker" :value="splitDate.month" @input="updateDate()"/>
    Year: <input type="number" ref="yearPicker" :value="splitDate.year" @input="updateDate()"/>
  </div>
</template>

Используя вычисляемое свойство, в данном случае splitDate, вы можете разделить и вернуть входную строку в объект со свойствами month и year:

[label StringDatePicker.vue] 
<script>
export default {
  props: ['value'],

  computed: {
    splitDate() {
      const splitValueString = this.value.split('/');

       return {
        month: splitValueString[0],
        year: splitValueString[1]
      }
    }
  },

  methods: {
    updateDate() {
      const monthValue = this.$refs.monthPicker.value;
      const yearValue = this.$refs.yearPicker.value;
      this.$emit('input', `${monthValue}/${yearValue}`);
    }
  }
};
</script>

Объект methods применяет свойство updateDate() для получения обновленных месяца и года из входной строки. Теперь вы можете импортировать расширенный пользовательский компонент StringDatePicker в другой файл и использовать директиву v-model для привязки и добавления ваших значений из вашего месяца и year одновременно.

Заключение

Директива v-model обеспечивает дополнительную функциональность при реализации в пользовательских компонентах Vue.js. Вы также можете интегрировать двустороннюю привязку данных в расширенные пользовательские компоненты для преобразования типов данных в точные форматы.

Чтобы узнать больше о Vue.js, посетите страницу темы Vue.js.