Как работает фреймворк Vue.js

Рассказываем о его преимуществах, концепции, о том, для каких сайтов и веб-приложений он подходит лучше всего. И конечно, о том, с чего можно начать изучение Vue.js

Для чего нужен фреймворк

Код любого сайта, даже самого сложного, с различными интерактивными элементами, можно написать на HTML и JavaScript. Но писать код большого сайта на чистом JS долго и неудобно. Чтобы упростить жизнь разработчикам, создали различные фреймворки JavaScript. Они содержат распространённые функции, сценарии: разработчику достаточно написать одну строчку для вызова нужной ему функции — и она сделает то же, что в чистом JavaScript делает целая страница кода. Подробнее о том, что представляют собой фреймворки, читайте в нашей статье «Что такое фреймворк».

Самые распространённые фреймворки JavaScript — Vue, Angular, Spring, Meteor. Vue, как и Angular, живёт во фронтенде — то есть их используют для внешней части сайта или приложения: в отрисовке интерфейса, постраничной навигации. Можно грубо сказать, что на чистом JS сейчас уже никто ничего не пишет (как сегодня не строят здания без гвоздей).

Слово vue — французский аналог английского view. Создатель фреймворка хотел в названии подчеркнуть, что его продукт отвечает за внешний вид (view), а английское слово оказалось занято другим опенсорсным проектом. Vue.js можно постепенно встраивать в готовые проекты: например, сначала написать на нём чат с поддержкой, потом — корзину, административную панель и так далее.

Любой сайт можно написать с помощью любого фреймворка JavaScript — или вообще без них. Но у каждого инструмента есть своя ниша, где использовать его удобнее всего. Vue создавался для написания:

  • небольших веб-сайтов и приложений, где важна скорость отклика;

  • личных блогов;

  • сайтов с высокой нагрузкой, например интернет-магазинов;

  • одностраничных (SPA) приложений — социальных сетей, микроблогов-сервисов, CMS;

  • адаптивных интерфейсов;

  • функциональных блоков на готовых сайтах — личных кабинетов, интерфейсов авторизации, онлайн-чатов, форм заявки и так далее.

Создатель Vue.js — Эван Ю, бывший сотрудник Google. В IT-гиганте он столкнулся с тем, что не существует готовых решений для быстрого прототипирования сложных пользовательских интерфейсов. Он решил создать свой фреймворк, который был бы простым и пригодным не только для прототипирования, но и для полноценной разработки веб-приложений.

Первый публичный релиз фреймворка состоялся в феврале 2014 года. Вторая версия вышла в сентябре 2016, а третья — в сентябре 2020.

Vue используется в приложениях и сайтах Alibaba, Baidu, Xiaomi, Sina Weibo, Netflix, Grammary, UpWork, GitLab.

Основные преимущества Vue.js

Подробная документация. В отличие от других фреймворков, у Vue замечательная документация. По сути, её одной достаточно для изучения фреймворка с нуля. Основные разделы документации — в том числе детальное описание API Vue, рекомендации, примеры приложений — создают и развивают в сообществе разработчиков. Также есть «Книга рецептов», где можно найти ответы на часто задаваемые вопросы о Vue, описание инструментов и основных библиотек Vue — инструментов разработчика, Vue CLI, Vue Loader, Vue Router, Vuex, Vue Server Renderer.

Аккуратное внедрение. С Vue не требуется переписывать сразу весь сайт или веб-приложение. Можно написать на нём, например, только чат с поддержкой или интерфейс авторизации — и всё будет нативно работать в веб-приложении, которое создано на другом фреймворке.

Низкий порог входа. Если вы хорошо знаете JavaScript, CSS, HTML, то для погружения в Vue вам не потребуется много времени: здесь нет сложных базовых вещей, без изучения которых вы не сможете написать работающий код. Погружение в React, например, обычно требует больших усилий.

Небольшой вес фреймворка. Vue занимает всего 20 Кб, поэтому сделанные на нём сайты загружаются и ранжируются поисковиками быстрее. Это особенно важно в веб-сервисах, где сложные интерфейсы должны работать мгновенно, не смущая пользователя задержкой.

Основные концепции фреймворка

Компоненты. Это повторно используемые части вашего сайта или приложения. Они помогают расширить основные html-элементы и внедрить переиспользуемый код. В чистом JavaScript вам пришлось бы копировать повторяющийся код каждый раз, а в Vue достаточно один раз написать компонент и вызывать его в нужных местах.

Один из простых компонентов, которые можно использовать в Vue.js, — Button (кнопка).

Пример кода компонента Button:

1<template>
2  <button @click="handleClick" :disabled="disabled">{{ text }}</button>
3</template>
4
5<script>
6export default {
7  props: {
8    text: { type: String, default: 'Click Me' },
9    disabled: { type: Boolean, default: false }
10  },
11  methods: {
12    handleClick() {
13      console.log('Button clicked')
14    }
15  }
16}
17</script>

В этом примере мы создаём компонент кнопки с помощью тега <template>. В нём определены два свойства (props): text и disabled, которые устанавливаются по умолчанию на ’Click Me’ и false соответственно.

Кроме того, в компоненте определён метод handleClick, который будет вызываться при нажатии на кнопку и выводить сообщение Button clicked в консоль.

В компоненте используются директивы Vue.js, такие как @click и :disabled, для отслеживания клика по кнопке и управления её доступностью соответственно.

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

В Vue.js есть так называемые однофайловые компоненты. В файл с расширением .vue можно записать стили, шаблон и логику на любом удобном вам препроцессоре и языке, компилирующемся в JS (CoffeeScript, TypeScript).

Директивы — специальные токены в разметке, сообщающие фреймворку, что нужно что-то сделать с элементом DOM (древовидной структуры страницы, состоящей из узлов). Вот некоторые встроенные директивы Vue:

  • v-show — обеспечивает видимость элемента в соответствии с переданным значением (True или False);

  • v-if — содержит условие для рендера элемента;

  • v-on — добавляет событие и его обработчики на элемент;

  • v-bind — динамически связывается с одним или несколькими атрибутами;

  • v-for — циклично проходит массив объектов;

  • v-once — рендерит элемент только в начале и больше не следит за ним;

  • v-pre — не компилирует элемент и его дочерние элементы.

Пример одной из таких директив:

1<template>
2    <div>
3        <h1 v-if="showTitle">My Title</h1>
4        <p v-for="item in items" :key="item.id">{{ item.name }}</p>
5    </div>
6</template>
7
8<script>
9export default {
10    data() {
11        return {
12            showTitle: true,
13            items: [
14                { id: 1, name: 'Item 1' },
15                { id: 2, name: 'Item 2' }
16            ]
17        }
18    }
19}
20</script>

В этом примере мы используем две директивы Vue.js — v-if и v-for:

  • v-if используется для условного рендеринга элементов — если свойство showTitle имеет значение true, рендерится заголовок h1, в противном случае заголовок не отображается;

  • v-for используется для отображения данных в списке — мы перебираем элементы массива items и отображаем их в списке параграфов.

Обе директивы привязывают свойства Vue-экземпляра к элементу DOM, делая возможным динамическое изменение содержимого страницы. Директивы предоставляют удобные средства для связывания данных и элементов внутри Vue-компонентов.

Как видно из примеров, директивы имеют префикс v-. В них передаётся значение состояния, а в качестве аргументов могут быть атрибуты html или события.

В Vue разработчик может не только использовать встроенные директивы, но и создавать собственные.

Переходы — это изменения на сайте или в приложении при определённых действиях, например наведении курсора или выборе элемента в списке. Основная цель перехода — продемонстрировать пользователю, что что-то изменилось. Переходы в Vue включают в себя следующие инструменты:

  • автоматическое применение классов для CSS-переходов и анимации;

  • подключение библиотек для CSS-анимации из сторонних источников, например Animate.css;

  • изменения DOM с помощью JavaScript;

  • подключение JS-библиотек из сторонних источников для анимации, например Velocity.js.

Код перехода при наведении курсора на меню с использованием фреймворка Vue может выглядеть следующим образом:

1html
2<template>
3  <div>
4    <nav>
5      <ul>
6        <li v-for="item in menuItems"
7          :key="item.id"
8          @mouseenter="toggleMenu(item.id, true)"
9          @mouseleave="toggleMenu(item.id, false)"
10          :class="{ active: item.active }"
11        >
12          <a href="#">{{ item.label }}</a>
13          <ul :class="{ open: item.active }">
14            <li v-for="(subItem, index) in item.subItems"
15              :key="index"
16            >
17              <a href="#">{{ subItem }}</a>
18            </li>
19          </ul>
20        </li>
21      </ul>
22    </nav>
23  </div>
24</template>
25
26<script>
27export default {
28  data() {
29    return {
30      menuItems: [
31        {
32          id: 1,
33          label: 'Home',
34          subItems: [],
35          active: false,
36        },
37        {
38          id: 2,
39          label: 'About',
40          subItems: ['Team', 'Company', 'History'],
41          active: false,
42        },
43        {
44          id: 3,
45          label: 'Blog',
46          subItems: ['News', 'Tutorials', 'Updates'],
47          active: false,
48        },
49        {
50          id: 4,
51          label: 'Contact',
52          subItems: [],
53          active: false,
54        },
55      ],
56    };
57  },
58  methods: {
59    toggleMenu(id, active) {
60      this.menuItems.forEach((item) => {
61        if (item.id === id) {
62          item.active = active;
63        } else {
64          item.active = false;
65        }
66      });
67    },
68  },
69};
70</script>
71
72<style>
73nav ul {
74  list-style: none;
75  margin: 0;
76  padding: 0;
77}
78
79nav ul li {
80  position: relative;
81}
82
83nav ul li > ul {
84  position: absolute;
85  top: 100%;
86  left: 0;
87  background-color: #fff;
88  box-shadow: 0px 3px 5px rgba(0, 0, 0, 0.2);
89  display: none;
90}
91
92nav ul li.active > ul {
93  display: block;
94}
95</style>

Сначала мы создаём список меню menuItems. У каждого элемента есть уникальный идентификатор id, метка label и массив подэлементов subItems. Поле active указывает, активен ли элемент в настоящее время. Когда пользователь наводит курсор на элемент меню, мы вызываем метод toggleMenu и передаём ему идентификатор и флаг активности. Метод toggleMenu проходит по всем элементам меню и устанавливает флаг active для элемента с соответствующим идентификатором. Если флаг активности равен true, мы также меняем класс элемента на active, чтобы показать соответствующее подменю с помощью CSS.

Каждый элемент меню отображается с помощью цикла v-for, а класс active устанавливается с помощью директивы :class. Если элемент имеет подменю, мы отображаем его с помощью вложенного цикла v-for и задаём соответствующий класс open с помощью директивы :class. Мы также определяем стили для элементов меню в CSS. При наведении курсора на элемент меню мы меняем цвет фона и добавляем тень с помощью селектора :hover. Ещё мы используем псевдокласс :active, чтобы подчеркнуть выбранный элемент.

Какие инструменты нужны для работы в Vue.js

Простой способ использования Vue, который не требует установки никаких дополнительных инструментов, — подключение к html-странице скрипта Vue с помощью тега <script>. Кстати, этим методом пользуются не только в учебных целях, но и в реальной разработке. Правда, масштабировать проект в нём неудобно, так что для создания полноценных веб-приложений и сайтов лучше воспользоваться другими методами. Для подключения фреймворка в html-странице прямо над закрывающим тегом </body> нужно добавить следующее:

1<!-- Версия для разработки включает в себя возможность вывода в консоль полезных уведомлений -->
2<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
3<script>
4
5</script>

Всё, теперь можно добавлять корневой элемент, к которому будет подключён экземпляр Vue, сам новый экземпляр Vue, переменные — и выводить всё на страницу в браузере.

Второй вариант — классический, он подходит для создания полноценных проектов с Vue.js. Это использование командной строки для создания приложения. Чтобы им воспользоваться, нужно сначала установить Node.js — это северная платформа для поддержки выполнения JavaScript-кода. Кстати, Node.js и всё остальное лучше устанавливать на ОС Linux. Далее следует установить Vue CLI. Скачайте пакет установки с сайта или отправьте команду в консоли:

1npm install -g @vue/cli

Далее создаёте приложение командой vue create. Потом открываете созданный файл, пишете код, запускаете его.

Третий вариант работы с Vue — использование инструмента Vue UI. Это программа с графическим интерфейсом, которая устанавливается на компьютер вместе с Vue CLI. Здесь тоже можно писать код и запускать его — всё как и в предыдущем варианте. Но так может быть удобнее для тех, кто не любит работать в консоли.

Краткий пересказ от YandexGPT