Skip to content

6. проект [vuejs-04]: директиви [v-model, v-bind], обчислені атрибути, форма введення даних

Структура проекту [vuejs-04] така:

Image

6.1. Головний скрипт [main.js]

Він такий самий, як у попередньому прикладі.

6.2. Головний компонент [App]

Код [App.vue] має такий вигляд:


<template>
  <b-container>
    <b-card>
      <!-- повідомлення-презентація -->
      <b-row>
        <b-col cols="8">
          <b-alert show variant="success" align="center">
            <h4>[vuejs-04] : directives [v-model, v-bind], attributs calculés, formulaire de saisie</h4>
          </b-alert>
        </b-col>
      </b-row>
      <Form />
    </b-card>
  </b-container>
</template>


<script>
  import Form from "./components/Form.vue";

  export default {
    name: "app",
    components: {
      Form
    }
  };
</script>

Компонент [App.vue] використовує новий компонент [Form] (рядки 12, 19, 24).

6.3. Компонент [Form]

Код компонента [Form] такий:


<template>
  <div>
    <!-- форма -->
    <b-form>
      <!-- елементи форми -->
      <b-row>
        <b-col cols="4">
          <b-card bg-variant="light">
            <b-form-group label="Nombre d'enfants à charge" label-for="enfants">
              <b-input type="text"
                       id="enfants"
                       placeholder="Indiquez votre nombre d'enfants"
                       v-model="enfants"
                       v-bind:state="enfantsValide" />
              <b-form-invalid-feedback :state="enfantsValide">Vous devez saisir un nombre positif ou nul</b-form-invalid-feedback>
            </b-form-group>
            <!-- кнопка -->
            <b-button variant="primary" :disabled="formInvalide" @click="doSomething">Valider</b-button>
          </b-card>
        </b-col>
      </b-row>
    </b-form>
    <b-row class="mt-3">
      <b-col cols="4">
        <b-alert show variant="warning" align="center">
          <h4>enfants= {{enfants}}</h4>
        </b-alert>
      </b-col>
    </b-row>
  </div>
</template>

<!-- скрипт -->
<script>
  export default {
    // ім'я
    name: "Form",
    // статичні атрибути компонента
    data() {
      return {
        // кількість дочірніх елементів
        enfants: ""
      };
    },

    // обчислені атрибути
    computed: {
      // атрибут [formInvalide]
      formInvalide() {
        return !this.enfantsValide;
      },
      // атрибут [enfantsInvalide]
      enfantsValide() {
        return Boolean(this.enfants.match(/^\s*\d+\s*$/));
      }
    },
    // методи
    methods: {
      doSomething() {
        // кількість дочірніх елементів відома під час перевірки
        alert("Nombre d'enfants : " + this.enfants);
      }
    }
  };
</script>

Візуальне відображення

Image

Image

Коментарі

  • рядки 4–32: тег <b-form> вводить форму Bootstrap;
  • рядок 6: тег <b-row> вводить рядок у форму;
  • рядок 7: тег <b-col cols=’4’> вводить стовпець, що займає 4 стовпці Bootstrap;
  • рядок 8: тег <b-card> [6] створює картку Bootstrap — область, обрамлену межею;
  • рядок 9: тег <b-form-group> вводить групу пов’язаних між собою елементів форми. Тут текст (атрибут [label]) [1] пов’язаний із полем введення (атрибут [label-for]). Значення [label-for] є значенням поля [id], рядок 12, поля введення;
  • рядки 10–14: тег <b-input> [2] вводить поле введення:
    • рядок 10: [type=’text’] вказує, що в полі введення можна вводити текст. Можна було б написати [type=’number’] з обмеженнями [min=’val1’ max=’val2’ step=’val3’], оскільки очікується наявність дочірніх елементів. Ми вказали [type=’text’], щоб продемонструвати, як перевіряти правильність введених даних;
    • рядок 12: атрибут [placeholder] [3] визначає повідомлення, що відображається у полі введення, доки користувач нічого не ввів;
    • рядок 13: директива [v-model] двонаправлено пов’язує введене значення з атрибутом [enfants] (рядок 42) компонента:
      • коли введене значення змінюється, то значення атрибута [enfants] також змінюється;
      • коли значення атрибута [enfants] змінюється, то значення, що вводиться, також змінюється, тобто змінюється вміст [2];
      • важливо зрозуміти, що завдяки описаному вище механізму, коли користувач натискає на кнопку [Valider] [5], атрибут [enfants] у рядку 42 приймає значення, введене в [2];
    • рядок 14: директива [v-bind] встановлює зв’язок між, з одного боку, атрибутом тегу <b-input> (у даному випадку атрибутом [state]) та, з іншого боку, атрибутом компонента (у даному випадку [enfantsValide]) у рядку 53. Атрибут [enfantsValide] є особливим у тому сенсі, що це функція, яка повертає значення атрибута. Такий тип атрибута називається обчислювальним атрибутом. Обчислювані атрибути містяться у властивості [computed] компонента (рядок 47). Обчислювані атрибути використовуються так само, як і статичні атрибути функції [data]: у рядку 14 не пишуть [v-bind:state=’enfantsValide()’], а [v-bind:state=’enfantsValide’], без дужок. Також під час читання [template] неможливо відрізнити обчислюваний атрибут від статичного. Для цього потрібно переглянути код скрипта компонента;
    • рядок 14: атрибут [state] визначає статус (дійсний/недійсний) введеного значення: якщо [enfantsValide] повертає значення [true], введене значення вважається дійсним, інакше — недійсним. На знімку екрана вище показано компонент [b-input], коли функція [enfantsValide] повертає значення [false];
    • рядок 15: тег <b-form-invalid-feedback> [4] дозволяє відображати повідомлення, коли введене значення [2] є недійсним. Його атрибут [:state=’enfantsValide’] ідентичний атрибуту [v-bind:state=’enfantsValide’] у рядку 14. Директиву [v-bind] можна опустити, але знак [:] слід залишити. Отже, повідомлення про помилку з’являється, коли значення атрибута [enfantsValide] дорівнює [false];
    • рядок 16: кінець групи елементів <b-group>;
    • рядок 18: кнопка [5], яка дозволить підтвердити введені дані:
      • вона буде синього кольору [variant=’primary’];
      • [:disabled="formInvalide"]: атрибут [disabled] дозволяє активувати/деактивувати кнопку. Цей атрибут пов’язаний (v-bind) з обчислювальним атрибутом [formInvalide] у рядку 49;
      • [@click="doSomething"]: коли користувач натисне на кнопку, буде виконано метод [doSomething], рядок 59;
    • рядки 19–22: закриття різних відкритих тегів;
    • рядки 23–29: новий рядок у [template]. [class=’mt-3’] означає [margin (m) top (t) égale à 3 spacers]. [spacer] — це міра відступу в Bootstrap. Цей клас створює відступ [8] на знімку екрана вище. Без цього класу область [7] прилягає до області [1-6];
    • рядок 24: стовпець, що займає 4 стовпці Bootstrap;
    • рядки 25–27: сповіщення [warning], що відображає значення статичного атрибута [enfants] (рядок 42). Оскільки цей атрибут має двосторонню прив’язку до поля введення, щойно користувач змінює його, значення, що відображається у сповіщенні, також змінюється;
    • рядки 34–65: код компонента jS;
    • рядок 42: єдиний статичний атрибут компонента;
    • рядки 47–56: обчислювані атрибути компонента;
    • рядки 53–55: введене значення вважається дійсним, якщо це додатне ціле число, перед яким або після якого можуть бути «пробіли»;
    • рядки 49–51: форма вважається дійсною, якщо введене значення кількості дітей є дійсним. Зазвичай форма має кілька полів введення і вважається дійсною, якщо всі вони є дійсними;
    • рядки 58–63: методи компонента, які реагують на його події. Тут є лише одна подія: [click] на кнопці. Ми просто відображаємо введене значення, щоб показати, що маємо до нього доступ;

6.4. Виконання проєкту

Змінюємо файл [package.json] і запускаємо проект:

Image