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

Новые функции в Vue 3

  1. API композиции
  2. Полная поддержка TypeScript
  3. Порталы
  4. Фрагменты
  5. саспенс
  6. Глобальное изменение API монтирования/конфигурации
  7. Несколько v-моделей
  8. Пользовательский API директив

До официального релиза вы можете использовать бета-версию Vue 3, найденную в репозитории vue-next GitHub. Некоторые из новых функций Vue 3 доступны в виде плагинов для Vue 2, и я упомяну о них, когда мы доберемся до них. В Vue 3 эти функции встроены, что дает разработчикам более удобный мгновенный опыт работы с Vue (те, кто работал с Vue, понимают небольшие проблемы, с которыми мы сталкиваемся).

Vue — это не «просто еще один фреймворк». Vue разработан как интерфейсная структура для веб-приложений, чтобы помочь вам создать «представление» для вашего приложения. Его можно использовать с React и Angular, которые являются монолитными фреймворками, для обеспечения пользовательского интерфейса, в то время как за кулисами у вас есть Angular и React, выполняющие остальную работу.

API композиции

Composition API — это альтернатива текущему API Vue Options. Он разработан с учетом поддержки Typescript, а также повторного использования кода, удобства сопровождения и объединения функций по логическому принципу.

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

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

<script>
export default {
  data () {
    return {
      //Properties for data
      //Properties for filtering
      //Properties for sorting
      //Properties for paging
    }
  },
  methods: {      
    //Methods for data
    //Methods for filtering
    //Methods for sorting
    //Methods for paging
  },
  computed: {
    //Values for data
    //Values for filtering
    //Values for sorting
    //Values for paging
  }
}
</script>

Как видите, функциональность для каждого логического сегмента разделена между отдельными параметрами API параметров.

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

<script>
import { ref } from "@vue/composition-api"
export default {
  setup () {
    const theNumber = ref(1)
    function doubleTheNumber () {
      theNumber.value = parseInt(theNumber.value) * 2
    }
    return {
      theNumber,
      doubleTheNumber
    }
  }
}
</script>

Означает ли это, что вы собираетесь использовать один огромный метод настройки для всех своих компонентов? Нет, это не так. Вы можете использовать функции композиции в другом месте (в других файлах), чтобы не раздувать ваш метод установки. Это имеет явное преимущество разделения кода и повторного использования. Функция композиции может использоваться в любом количестве компонентов.

Джоэл Паркс описывает Начало работы с Vue 3 Component API в другой статье.

Полная поддержка TypeScript

Vue 3 поставляется с полной поддержкой TypeScript. Vue 2 смог приспособить TypeScript — вы могли встроить его в свое приложение Vue 2. Это была не лучшая компоновка, и во многих случаях она выглядела изрубленной.

Vue 3 написан на TypeScript с автоматически сгенерированными определениями типов и API, одинаковым как для TypeScript, так и для JavaScript.

Порталы

Порталы — это концепция из React. Портал делает то, что написано на банке: он отвечает за отображение чего-то в месте, отличном от того, где оно объявлено. В случае Vue 3 портал позволяет отображать компонент или часть компонента в другом месте дерева DOM.

Порталы удобны для всего: модальных окон, уведомлений, всплывающих окон и так далее. Вы хотите, чтобы все эти элементы отображались выше всего остального, за пределами основных элементов, составляющих тело страницы. С порталами вам не нужен беспорядочный CSS, бессмысленная z-индексация или элементы, появляющиеся в других случайных местах на странице.

Порталы доступны во Vue 2 через сторонние плагины — например, portal-vue.

Чтобы использовать портал в своем приложении, вам понадобится тег с идентификатором. Примером может быть <div> с идентификатором модального окна непосредственно перед концом вашего тела HTML.

<!DOCTYPE html>
<html lang="en">
  <head>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but this app doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <div id="modal"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

Далее, всякий раз, когда вы хотите телепортировать компонент или часть компонента в «модальный режим», вы используете синтаксис портала.

<template>
  <Portal target="#modal">
    <div>I'm rendered in the modal, honest, I will be!</div>
  <Portal>
</template>

Фрагменты

Еще одна концепция, пришедшая из React, — это фрагменты — в некоторых кругах ее также называют «несколько корневых узлов». В Vue 2 вам разрешен только один корневой элемент в компоненте. Фрагменты решают эту проблему и позволяют вам использовать более одного корневого узла в компоненте.

На момент написания не было примеров того, как фрагменты реализованы в Vue 3. Однако, оглядываясь назад на плагин, который обеспечивает аналогичную функциональность в Vue 2, вы можете увидеть, что синтаксис выглядит следующим образом:

<Fragment>
  <ComponentOne />
  <ComponentTwo />
  <ComponentThree />
</Fragment>

Если мы получим что-то подобное в Vue 3, это может быть очень мощно. Существующая функциональность — одна из тех мелочей, которые отталкивают некоторых разработчиков от Vue 2. Вам не нужно добавлять дополнительную иерархию в HTML только для того, чтобы система работала.

Приведенный выше пример плагина взят из vue-fragment, созданного Julien Barbay, членом сообщества Vue. Текущее обсуждение предполагает, что Vue 3 интегрирует этот плагин в кодовую базу.

саспенс

Приостановка — это специальный компонент, который отображает резервный контент вместо вашего компонента до тех пор, пока не будет выполнено условие.

Возможно, вы помните все те случаи, когда вы писали компоненты и автоматически добавляли v-if="!isLoading" в корневой элемент и v-else во второй элемент для рендеринга во время загрузки контента, например, API или другой асинхронный вызов.

Для этого и существует саспенс. Шаблон ниже показывает пример синтаксиса, и он намного лучше, чем версия v-if.

<Suspense>
  <template #default>
    <MyData />
  </template>
  <template #fallback>
    <div>Loading...</div>
  </template>
</Suspense>

Как он определяет, что ваш компонент должен быть загружен (а не загружен)? Это связано с Composition API и описанным ранее методом настройки. Если вы сделаете метод установки асинхронным, приостановка вступит во владение, и, как только вы вернетесь из установки, отобразится запасной вариант.

Что-то вроде фрагмента ниже вызовет откат, пока вы не завершите вызов getMyData.

export default {
  async setup () {
    const data = await getMyData()
    return { data }    
  }
}

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

Глобальное изменение API монтирования/конфигурации

Монтирование вашего приложения Vue немного изменится и улучшит возможности того, что можно сделать: переход от одного глобального экземпляра к объявлению экземпляра и его монтированию.

Ниже приведены фрагменты текущего и нового синтаксиса, взятые из RFC в репозитории vuejs.

ТЕКУЩИЙ:

import Vue from 'vue'
import App from './App.vue'
Vue.config.ignoredElements = [/^app-/]
Vue.use(/* ... */)
Vue.mixin(/* ... */)
Vue.component(/* ... */)
Vue.directive(/* ... */)
new Vue({
  render: h => h(App)
}).$mount('#app')

НОВЫЙ:

import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
app.config.ignoredElements = [/^app-/]
app.use(/* ... */)
app.mixin(/* ... */)
app.component(/* ... */)
app.directive(/* ... */)
app.mount('#app')

Дает ли это возможность использовать несколько приложений? Может быть. Но ясно, что это не единственный экземпляр, и вы можете сделать гораздо больше с новым подходом.

Несколько v-моделей

Если вы знакомы с Vue, вы, скорее всего, знаете, что такое v-модель. Это директива для достижения двусторонней привязки к компоненту. Вы используете это, чтобы передать реактивное свойство и изменить его изнутри. Чего вы, возможно, не знаете, так это того, что v-model — это просто ярлык для передачи значения и прослушивания входного события.

Так что же означает «несколько v-моделей»? Вероятно, у вас была ситуация, когда вы хотели связать и прослушивать несколько свойств в своих компонентах. Например, вы можете создать компонент «Имя», содержащий два значения: «Имя» и «Фамилия». Вы хотите иметь v-модель для каждого из этих значений — и здесь начинают действовать несколько v-моделей.

<NameComponent
  v-model:fornames="forname"
  v-model:surname="surname"
/>

Этот новый синтаксис кажется простым, не так ли? Это так, и теперь вы можете, по сути, назвать свои v-модели.

Пользовательский API директив

Из использования Vue вы должны знать, что такое директива. Одна из основных встроенных директив — это та, которую мы показали, когда говорили о v-model. Есть и другие, включая v-show.

Вы можете создавать собственные директивы в Vue 2. Однако в Vue 3 они меняются. Вопрос в том, почему? Что ж, в текущей форме Directive API имеет собственный набор методов жизненного цикла, которые не соответствуют обычному жизненному циклу Vue. Привязать, вставить, обновить, componentUpdated и отменить привязку.

В Vue 3 эти методы синхронизированы со стандартным жизненным циклом Vue, так что теперь вы получаете beforeMount, смонтированный, beforeUpdate, обновленный, beforeUnmount и размонтированный. Гораздо легче запомнить при создании приложения. Больше не придется копаться, пытаясь найти нужный метод и вспоминая два разных жизненных цикла.

Будущее Vue Framework

На момент написания этого мы все еще находимся в режиме ожидания, ожидая выпуска Vue 3. Вы можете пойти и запачкать руки бета-версией в репозитории vue-next GitHub. Во Vue добавлено множество функций, которые помогают нам разрабатывать более качественные и быстрые системы. Есть улучшения качества жизни, а также больше способов для вас создавать приложения, которые помогают нам преуспевать и получать удовольствие от нашей профессии.

Следует помнить, что Vue 3 обратно совместим (с некоторыми незначительными изменениями кода). Он не отменяет существующий способ ведения дел; вместо этого он добавляет новые способы.

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

Попробуйте элементы управления Vue UI от Wijmo