Permalink
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
399 lines (336 sloc) 20.3 KB
title type order
Введение
guide
2

Что такое Vue.js?

Vue (произносится /vjuː/, примерно как view) — это прогрессивный фреймворк для создания пользовательских интерфейсов. В отличие от фреймворков-монолитов, Vue создан пригодным для постепенного внедрения. Его ядро в первую очередь решает задачи уровня представления (view), что упрощает интеграцию с другими библиотеками и существующими проектами. С другой стороны, Vue полностью подходит и для создания сложных одностраничных приложений (SPA, Single-Page Applications), если использовать его совместно с современными инструментами и дополнительными библиотеками.

Если вы хотите узнать больше о Vue перед тем как начать, мы создали видео с рассказом об основных принципах работы на примере проекта.

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

Начало работы

В этом официальном руководстве мы предполагаем, что вы уже знакомы с HTML, CSS и JavaScript на базовом уровне. Если же вы во фронтенд-разработке совсем новичок, начинать сразу с изучения фреймворка может быть не лучшей идеей — возвращайтесь, разобравшись с основами! Наличие опыта работы с другими фреймворками может помочь, но не является обязательным.

Проще всего попробовать Vue.js, начав с примера Hello World на JSFiddle. Просто откройте его в другой вкладке, и изменяйте по ходу чтения руководства. А можно и просто создать index.html файл на диске и подключить Vue:

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

или:

<!-- production-версия, оптимизированная для размера и скорости-->
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

Документация по установке описывает другие варианты установки Vue. Обратите внимание: мы не рекомендуем новичкам начинать с vue-cli, особенно если у них нет опыта работы с инструментами сборки Node.js.

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

Декларативный рендеринг

В ядре Vue.js находится система, которая позволяет декларативно отображать данные в DOM, используя простые шаблоны:

<div id="app">
  {{ message }}
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Привет, Vue!'
  }
})

{% raw %}

{{ message }}
<script> var app = new Vue({ el: '#app', data: { message: 'Привет, Vue!' } }) </script> {% endraw %}

Вот мы и создали наше первое Vue-приложение! Выглядит похоже на простой рендеринг шаблона, но "под капотом" Vue выполнил немало работы. Данные и DOM теперь реактивно связаны. Как это проверить? Просто откройте консоль JavaScript в своём браузере (прямо здесь, на этой странице) и задайте свойству app.message другое значение. Вы тут же увидите соответствующее изменение в окне браузера.

В дополнение к интерполяции текста, мы можем также связывать атрибуты элементов:

<div id="app-2">
  <span v-bind:title="message">
    Наведи курсор на меня пару секунд,
    чтобы увидеть динамически связанное значение title!
  </span>
</div>
var app2 = new Vue({
  el: '#app-2',
  data: {
    message: 'Вы загрузили эту страницу в: ' + new Date().toLocaleString()
  }
})

{% raw %}

Наведи курсор на меня пару секунд, чтобы увидеть динамически связанное значение title!
<script> var app2 = new Vue({ el: '#app-2', data: { message: 'Вы загрузили эту страницу в: ' + new Date().toLocaleString() } }) </script> {% endraw %}

Здесь мы встречаемся с чем-то новым. Атрибут v-bind, который вы видите, называется директивой. Директивы имеют префикс v-, указывающий на их особую природу. Как вы уже могли догадаться, они применяют к отображаемому DOM особое реактивное поведение, управляемое Vue. В данном примере директива говорит "сохраняй значение title этого элемента актуальным при изменении свойства message у экземпляра Vue".

Если вы снова откроете консоль JavaScript и введёте app2.message = 'какое-то новое сообщение', вы опять-таки увидите, что связанный код HTML — в данном случае, атрибут title — обновился.

Условия и циклы

Управлять присутствием элемента в DOM тоже довольно просто:

<div id="app-3">
  <span v-if="seen">Сейчас меня видно</span>
</div>
var app3 = new Vue({
  el: '#app-3',
  data: {
    seen: true
  }
})

{% raw %}

Сейчас меня видно
<script> var app3 = new Vue({ el: '#app-3', data: { seen: true } }) </script> {% endraw %}

Попробуйте ввести в консоли app3.seen = false. Сообщение должно пропасть.

Этот пример демонстрирует возможность связывать данные не только с текстом и атрибутами, но также и со структурой DOM. Более того, Vue также имеет мощную систему анимации, которая автоматически применяет transition-эффекты, когда элементы добавляются/обновляются/удаляются.

Есть несколько других директив, каждая из которых имеет свою особую функциональность. Например, директива v-for может быть использована для отображения списков, используя данные из массива:

<div id="app-4">
  <ol>
    <li v-for="todo in todos">
      {{ todo.text }}
    </li>
  </ol>
</div>
var app4 = new Vue({
  el: '#app-4',
  data: {
    todos: [
      { text: 'Изучить JavaScript' },
      { text: 'Изучить Vue' },
      { text: 'Создать что-нибудь классное' }
    ]
  }
})

{% raw %}

  1. {{ todo.text }}
<script> var app4 = new Vue({ el: '#app-4', data: { todos: [ { text: 'Изучить JavaScript' }, { text: 'Изучить Vue' }, { text: 'Создать что-нибудь классное' } ] } }) </script> {% endraw %}

В консоли введите app4.todos.push({ text: 'Новый элемент' }). Вы увидите, что к списку добавился новый элемент.

Работа с пользовательским вводом

Чтобы пользователи могли взаимодействовать с вашим приложением, используйте директиву v-on для наблюдения за событиями, указав метод-обработчик:

<div id="app-5">
  <p>{{ message }}</p>
  <button v-on:click="reverseMessage">Перевернуть сообщение</button>
</div>
var app5 = new Vue({
  el: '#app-5',
  data: {
    message: 'Привет, Vue.js!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})

{% raw %}

{{ message }}

Перевернуть сообщение
<script> var app5 = new Vue({ el: '#app-5', data: { message: 'Привет, Vue.js!' }, methods: { reverseMessage: function () { this.message = this.message.split('').reverse().join('') } } }) </script> {% endraw %}

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

Vue также содержит директиву v-model, позволяющую легко связывать элементы форм и состояние приложения:

<div id="app-6">
  <p>{{ message }}</p>
  <input v-model="message">
</div>
var app6 = new Vue({
  el: '#app-6',
  data: {
    message: 'Привет, Vue!'
  }
})

{% raw %}

{{ message }}

<script> var app6 = new Vue({ el: '#app-6', data: { message: 'Привет, Vue!' } }) </script> {% endraw %}

Разбиение приложения на компоненты

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

Дерево Компонентов

Во Vue компонент — это, по сути, экземпляр Vue с предустановленными опциями. Создать новый компонент во Vue просто:

// Определяем новый компонент под названием todo-item
Vue.component('todo-item', {
  template: '<li>Это одна задача в списке</li>'
})

Теперь его можно использовать в шаблоне другого компонента:

<ol>
  <!-- Создаём экземпляр компонента todo-item -->
  <todo-item></todo-item>
</ol>

Пока что у нас получилось так, что во всех элементах списка задач будет содержаться один и тот же текст — это не очень-то интересно. Хотелось бы иметь возможность передать данные от родителя в дочерние компоненты. Давайте изменим определение компонента, чтобы он мог принимать входной параметр:

Vue.component('todo-item', {
  // Компонент todo-item теперь принимает
  // "prop", то есть пользовательский параметр.
  // Этот параметр называется todo.
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})

Теперь можно передать текст задачи в каждый компонент с помощью v-bind:

<div id="app-7">
  <ol>
    <!--
      Теперь мы можем передать каждому компоненту todo-item объект
      с информацией о задаче, который будет динамически меняться.
      Мы также определяем для каждого компонента "key",
      значение которого будет объяснено далее в руководстве.
    -->
    <todo-item
      v-for="item in groceryList"
      v-bind:todo="item"
      v-bind:key="item.id">
    </todo-item>
  </ol>
</div>
Vue.component('todo-item', {
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})

var app7 = new Vue({
  el: '#app-7',
  data: {
    groceryList: [
      { id: 0, text: 'Овощи' },
      { id: 1, text: 'Сыр' },
      { id: 2, text: 'Что там ещё люди едят?' }
    ]
  }
})

{% raw %}

<script> Vue.component('todo-item', { props: ['todo'], template: '
  • {{ todo.text }}
  • ' }) var app7 = new Vue({ el: '#app-7', data: { groceryList: [ { id: 0, text: 'Овощи' }, { id: 1, text: 'Сыр' }, { id: 2, text: 'Что там ещё люди едят?' } ] } }) </script> {% endraw %}

    Конечно же, этот пример слегка надуман, но посмотрите сами — нам удалось разделить наше приложение на два меньших объекта, и дочерний оказался в разумной мере отвязан от родительского с помощью интерфейса входных параметров. Теперь мы можем и далее улучшать наш компонент <todo-item>, усложняя шаблон и логику, но не влияя на родительское приложение.

    В крупных приложениях разделение на компоненты становится обязательным условием для сохранения управляемости процесса разработки. Разговор о компонентах ещё далеко не закончен и будет продолжен далее в этом руководстве, но уже сейчас можно взглянуть на (вымышленный) пример того, как мог бы выглядеть шаблон приложения, использующего компоненты:

    <div id="app">
      <app-nav></app-nav>
      <app-view>
        <app-sidebar></app-sidebar>
        <app-content></app-content>
      </app-view>
    </div>

    Отношение к пользовательским элементам Web Components

    Вы могли заметить, что компоненты Vue довольно похожи на пользовательские элементы, являющиеся частью спецификации W3C Web Components. Дело в том, что синтаксис компонентов Vue и правда намеренно следует этой спецификации. В частности, компоненты Vue реализуют API слотов и специальный атрибут is. Вместе с тем, есть и несколько ключевых различий:

    1. Спецификация Web Components всё ещё находится в статусе черновика и не реализована ни в одном из браузеров. Компоненты Vue, напротив, не требуют никаких полифиллов и устойчиво работают во всех поддерживаемых браузерах (IE9 и выше). При необходимости компоненты Vue могут быть обёрнуты в нативные пользовательские элементы.

    2. Компоненты Vue предоставляют важные возможности, недоступные в простых пользовательских элементах. Самые важные из них: кросс-компонентная передача данных, коммуникация с использованием пользовательских событий и интеграция с инструментами создания сборок.

    Готовы к большему?

    Мы всего лишь кратко представили самые основные возможности ядра Vue.js — остаток этого руководства посвящён значительно более детальному рассмотрению этих и других возможностей, так что советуем прочитать его целиком!

    <iframe src="https://player.vimeo.com/video/247494684" style="height: 100%; left: 0; position: absolute; top: 0; width: 100%; margin: 0" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
    <script src="https://player.vimeo.com/api/player.js"></script>