Совсем скоро должна выйти новая версия Vue.js — 2.6. Под катом вы найдете обзор новых фич следующей версии, включая новый синтаксис слотов, Vue.observable () и много чего еще!
1. Новый синтаксис для scoped slots
Это одно из самых значимых изменений. Оно включает в себя:
Новую директиву v-slot, объединяющую slot и slot-scope
Сокращение для использования именованных scoped slots
Проще всего это понять на примере:
Как использовались scoped slots в версии Vue@2.5.22:
{{ `Default slot with message: ${message}` }}
{{ `Named slot with text: ${text}` }}
Как можно теперь:
{{ `Default slot with message: ${message}` }}
{{ `Named slot with text: ${text}` }}
Для дефолтного слота можно применить специальный синтаксис, если не используются именованные слоты:
{{ `Default slot with message: ${message}` }}
И вот сокращение для именованных слотов:
{{ `Named slot with text: ${text}` }}
Новую директиву можно использовать и без каких-либо scope-переменных, но тогда слот все-равно попадет в $scopedSlots родителя.
Ссылки:
Новый синтаксис v-slot
Сокращение для v-slot
2. Динамический аргумент директивы
Если вы хотите динамический аргумент для v-bind или v-on, то во Vue@2.5.22 у вас есть только один вариант:
Но у него есть пара недостатков:
Не все знают о возможности использования v-bind/v-on на объектах и о динамических названиях переменных
vue-template-compier генерирует неэффективный код
v-slot не имеет похожего синтаксиса для объектов
Чтобы избавиться от них, Vue@2.6.0 представляет новый синтаксис:
Примеры использования:
Hello
Cool slot
Ссылки:
3. Создание реактивных объектов с помощью Vue.observable ()
Раньше, чтобы создать реактивный объект, нужно было засунуть его внутрь инстанса vue-компонента. Теперь у нас есть отдельный метод, который делает объект реактивным — Vue.observable ().
Реактивный объект можно спокойно использовать в render- и computed-функциях.
Пример использования:
import Vue from vue;
const state = Vue.observable({
counter: 0,
});
export default {
render() {
return (
{state.counter}
);
},
};
4. Загрузка данных на сервере
В новом обновлении vue-server-renderer изменил стратегию загрузки данных для SSR.
Раньше нам советовали вызывать методы asyncData () у компонентов, полученных через router.getMatchedComponents ().
В новой версии появился специальный метод у компонентов — serverPrefetch (). vue-server-renderer вызовет его у каждого компонента и дождется решения возвращенных промисов:
{{ item.name }}
Чтобы узнать, когда завершилось ожидание всех serverPrefetch () и приложение завершило свой рендеринг, в контексте функции серверного рендера появилась возможность добавить хук rendered ():
/* Упрощенный entry-server.js */
import { createApp } from './app';
export default context => new Promise((resolve, reject) => {
const { app, router, store } = createApp();
const { url } = context;
router.push(url);
router.onReady(() => {
context.rendered = () => {
// Передаем состояние хранилища после завершения всех serverPrefetch()
context.state = store.state;
};
resolve(app);
}, reject);
});
5. Улучшенный вывод ошибок компилятора
При компиляции html в render-функцию vue-template-compiler может выдать ошибки. Раньше Vue выводил описание ошибки без ее местоположения, теперь новая версия будет показывать, где она находится.
Пример:
{{ message }}
Ошибка vue-template-compiler@2.5.22:
Error compiling template:
{{ message }}
- cannot be keyed. Place the key on real elements instead.
Новый вывод ошибки vue-template-compiler@2.6.0:
Errors compiling template:
cannot be keyed. Place the key on real elements instead.
1 |
2 |
3 |
| ^^^^^^^^^^^^^^
4 | {{ message }}
5 |
6. Отлов асинхронных ошибок
Теперь Vue может ловить даже асинхронные ошибки в хуках жизненного цикла и обработчиках событий.
Пример:
/* TestComponent.vue */
Some message
Ошибка после маунта:
[Vue warn]: Error in mounted hook (Promise/async): "Error: Some Error"
Ошибка после клика:
[Vue warn]: Error in v-on handler (Promise/async): "Error: Another Error"
7. Новая сборка для ESM браузеров
В новой версии добавилась еще одна сборка Vue — vue.esm.browser.js. Она предназначена для браузеров, поддерживающих ES6 Modules.
Ее особенности:
Содержит компилятор HTML в render-функцию
Использует синтаксис ES6 Modules
Содержит нетранспилированный код
Пример использования:
Document
{{ message }}
Если честно, мне бы хотелось видеть еще одну сборку — такую же, как vue.esm.browser.js, но без компилятора HTML. Тогда я бы смог подвозить браузерам с ES6 Modules более свежий код, когда компилирую шаблоны при сборке.
8. Сокращение для v-bind.prop
У директивы v-bind есть специальный модификатор — .prop. Посмотреть, что он делает, можно вот тут в документации. Сам я ни разу его не использовал и не представляю себе случай, когда его стоит применить.
Для него теперь есть специальное сокращение: вместо записи v-bind: someProperty.prop=«foo» можно писать .someProperty=«foo».
Пример:
Как было во Vue@2.5.22:
Как можно во Vue@2.6.0:
9. Поддержка кастомного toString ()
Тут все просто: если вы переопределите метод toString () у объекта, то Vue при отображении станет использовать его вместо JSON.stringify ().
Пример:
/* TestComponent.vue */
{{ message }}
В версии Vue@2.5.22 мы увидим на экране:
{ "value": "qwerty" }
В версии Vue@2.6.0:
Hello Habr!
10. Работа v-for с итерируемыми объектами
В новой версии v-for может работать с любыми объектами, которые реализуют iterable protocol, например Map или Set. Правда, для Map и Set в версии 2.X не будет поддерживаться реактивность.
Пример:
/* TestComponent.vue */
{{ item }}
Посмотреть все новые фишки в деле можно прямо сейчас, установив бета-версию Vue: