Добавление пользовательского события в компонент

Завершено

Завершим приложение, добавив форму. Форма будет содержать раскрывающийся список, в котором пользователь сможет выбрать нужный класс, и кнопку для бронирования круиза. Для этого вы настроите новый компонент и создадите событие для кнопки. В конце вы вызовете новый компонент из Host.vue.

Создание компонента

Начните с создания компонента.

  1. В Visual Studio Code создайте файл с именем BookingForm.vue в папке src/components.

  2. В BookingForm.vue введите vue и выберите <vue> с default.vue в меню фрагментов.

    Снимок экрана: меню фрагментов кода с выбранным фрагментом.

    Фрагмент создаст структуру по умолчанию.

Добавление кода для компонента

Добавим код, который будет использоваться компонентом, включая регистрацию свойств, выдачи, данные и методы.

  1. Откройте файл src/components/BookingForm.vue, если он еще не открыт.

  2. Внутри фигурных скобок ({ }) для export default добавьте следующий код для настройки компонента:

    props: {
        cabins: Array,
    },
    emits: ['bookingCreated'],
    data() {
        return {
            cabinIndex: -1
        }
    },
    methods: {
        bookCabin() {
            if(this.cabinIndex < 0) return;
            this.$emit('bookingCreated', this.cabinIndex);
            this.cabinIndex = -1;
        },
    }
    

    Этот код начинается с создания свойства cabins для вывода списка доступных классов. Мы предоставляем одно событие с именем с bookingCreated помощью emits. Мы создаем элемент данных с именем cabinIndex для хранения выбранного индекса классов.

    В конце мы создаем метод с именем bookCabin. Этот метод проверяет значение cabinIndex и выполняется, только если значение равно 0 или больше (это означает, что пользователь выбрал класс). Если эта проверка пройдет успешно, мы выпустим событие, возвращающее выбранное значение cabinIndex, и сбросим значение cabinIndex до –1.

Добавление шаблона для отображения

Добавив код, можно заняться отображением. Мы хотим создать раскрывающийся список для выбора класса и кнопку для бронирования поездки. Кнопка будет вызывать созданную ранее функцию bookCabin.

  1. Откройте файл src/components/BookingForm.vue, если он еще не открыт.

  2. Добавьте следующий код в теги <template>, чтобы создать отображение:

    <section>
    <h2>Book now!</h2>
    <form>
        <div class="row">
            <label for="cruise-cabin">Select class:</label>
            <select id="cruise-cabin" v-model="cabinIndex">
                <option disabled value="-1">Select a cabin</option>
                <option v-for="(cabin, index) in cabins" :value="index" :key="index">
                    {{ cabin.name }} $ {{ cabin.price.toLocaleString('en-US') }}
                </option>
            </select>
        </div>
        <div class="row">
            <button class="button" type="button" @click="bookCabin">Book now!</button>
        </div>
    </form>
    </section>
    

    HTML создает форму. Для создания раскрывающегося списка мы проходим по свойству cabins с помощью v-for. Мы привязываем модель тега select к cabinIndex, который будет возвращен, когда пользователь выберет класс и нажмет кнопку. Затем мы настраиваем кнопку для вызова bookCabin при нажатии.

Добавление BookingForm на страницу

Для завершения добавьте только что созданную BookingForm в приложение, добавив ее в файл Host.vue.

  1. Откройте src/components/Host.vue.

  2. Импортируйте BookingForm, добавив следующий код после комментария TODO: Register next component:

    import BookingForm from './BookingForm.vue';
    
  3. Добавьте BookingForm в список доступных компонентов, добавив следующий код после комментария TODO: Add next component:

    BookingForm
    
  4. Добавьте метод для обработки пользовательского события bookingCreated, добавив следующий код после комментария TODO: Add methods:

    methods: {
        addBooking(cabinIndex) {
            const cabin = this.cruise.cabins[cabinIndex];
            const booking = {
                cabin: cabin.name,
                price: cabin.price
            }
            this.bookings.push(booking);
        }
    }
    

    Функция addBooking получает выбранный класс с помощью индекса. Затем функция создает новый объект booking с помощью cabin.name и cabin.price. Затем мы добавляем booking в массив bookings.

  5. Используйте компонент booking-form, добавив следующий код после комментария TODO: Add booking-form:

    <booking-form @booking-created="addBooking" :cabins="cruise.cabins"></booking-form>
    

    Мы подключаем функцию addBooking к событию booking-created и передаем список классов для вывода.

Отображение типа каюты

Давайте изменим шаблон, чтобы отобразить сведения о наших бронированиях. Вместо примера сообщения о резервировании, которое мы вывели в предыдущем упражнении, мы отобразим тип каюты для каждого резервирования.

  1. Откройте src/components/BookingList.vue.

  2. Внутри элемента <template> измените имя поля в div с booking.name на booking.cabin:

    <div class="row" v-for="(booking, index) in bookings" :key="index">
        <div>{{ booking.cabin }} </div>
    </div>
    

Тестирование страницы

После добавления всего кода давайте протестируем страницу.

  1. Сохраните все файлы, выбрав Файл>Сохранить все.

  2. Перейдите к http://localhost:8080 и обновите страницу.

  3. Выберите класс из раскрывающегося списка и нажмите кнопку.

    Появится новое резервирование.

    Снимок экрана: конечное приложение с формой слева и списком справа.

Вы создали и вызвали компонент с пользовательским событием.