6 полезных паттернов во Vue
Будем честны, чтение документации — не то, что любят разработчики в своей профессии. А зря, ведь при работе с современным фронтендом, а в особенности современными фреймворками, такими как Vue, React и т. д, которые постоянно развиваются, многие вещи могут меняться с каждым новым релизом. И вы, возможно, пропустили некоторые из новых и блестящих возможностей, которые были предоставлены после того, как вы впервые познакомились с фреймворком и прочитали документацию. Давайте посмотрим на очень интересные, но не популярные фичи.
Напомню, все предоставленные паттерны ниже являются частью официальной документации к Vue.
1. Управление состоянием загрузки
В больших приложениях часто может понадобиться разделить приложение на более мелкие компоненты и загружать их с сервера только тогда, когда это необходимо. Чтобы упростить это, Vue позволяет определить ваш компонент как фабрику, которая асинхронно загружает компонент. Vue будет триггерить фабрику только в тех случаях, когда компонент нуждается в отрисовке, а так же будет кэшировать результат для будущих ререндеров.
Новым в версии 2.3 является то, что фабрика асинхронных компонентов может возвращать объект следующего формата:
const AsyncComponent = () => ({
// Загружаемый компонент (должен быть Promise)
component: import('./MyComponent.vue'),
// Компонент, используемый во время загрузки необходимого
loading: LoadingComponent,
// Данный компонент отображается в том случае, если загрузка завершилась ошибкой
error: ErrorComponent,
// Задержка перед отображением loading компонента. По умолчанию 200мс.
delay: 200,
// Компонент error будет отображен, если таймаут существует и превышен. По умолчанию отсутствует.
timeout: 3000
})
При таком подходе у вас есть дополнительные опции состояния загрузки и ошибок, задержки при загрузке компонентов и тайм-аута.
2. «Дешёвые» статические компоненты с помощью v-once
Рендеринг простых HTML-элементов очень быстр во Vue, но иногда у вас может быть компонент, который содержит большое количество статического контента. В этих случаях вы можете убедиться, что он вычисляется только один раз, а затем кэшируется, добавив директиву v-once к корневому элементу.
Пример кода:
Vue.component('terms-of-service', {
template:
<div v-once>
<h1>Правила использования</h1>
... огромное полотно статического контента ...
</div>
})
3. Рекурсия в компонентах
Компоненты могут рекурсивно вызывать себя в своём собственном шаблоне. Единственное НО, они могут сделать это только, если имеют параметр name.
Если не быть осторожным, рекурсивные компоненты также могут привести к бесконечным циклам:
name: 'stack-overflow',
template: '<div><stack-overflow></stack-overflow></div>'
Компонент из примера выше, приведет к ошибке «Max stack size exceeded», поэтому убедитесь, что рекурсивный вызов является условным (т. е. использует v-if, который в конечном счёте окажется в значении false
)
4. Динамические аргументы директивы.
Аргументы директивы могут быть динамическими. Например, в v-mydirective:[аргумент]="значение"
, аргумент может быть обновлен на основе свойств данных в нашем экземпляре компонента! Это делает наши пользовательские директивы гибкими для использования во всем нашем приложении.
Вот директива, где динамический аргумент может быть обновлен для каждого экземпляра компонента:
<div id="dynamicexample">
<h3>Scroll down inside this section ↓</h3>
<p v-pin:[direction]="200">I am pinned onto the page at 200px to the left.</p>
</div>
Vue.directive('pin', {
bind: function (el, binding, vnode) {
el.style.position = 'fixed'
var s = (binding.arg == 'left' ? 'left' : 'top')
el.style[s] = binding.value + 'px'
}
})
new Vue({
el: '#dynamicexample',
data: function () {
return {
direction: 'left'
}
}
})
5. События и модификаторы клавиш
Для .passive, .capture, .once
Vue предлагает префиксы, которые могут быть использованы с on
:
Пример:
on: {
'!click': this.doThisInCapturingMode,
'keyup': this.doThisOnce,
'!mouseover': this.doThisOnceInCapturingMode
}
Для всех остальных событий и модификаторов клавиш не требуются префиксы, так как в обработчике можно использовать методы событий:
6. Внедрение зависимостей (Provide/Inject)
Есть несколько способов заставить два компонента общаться в Vue с преимуществами и недостатками в каждом из них. Новый способ, введенный в версию 2.2 — это использование внедрения зависимостей с помощью Provide/Inject.
Эта пара опций используется вместе, чтобы позволить компоненту-предку передавать данные для всех его потомков, независимо от того, насколько глубока иерархия компонентов, до тех пор, пока они находятся в одной и той же родительской цепи. Если вы знакомы с React, но это очень похоже на фичу React Context.
Пример:
// родитель передает 'foo'
const Provider = {
provide: {
foo: 'bar'
},
// ...
}
// дочерний компонент получает 'foo'
const Child = {
inject: ['foo'],
created () {
console.log(this.foo) // => "bar"
}
// ...
}
Заключение
Всегда быть в курсе событий – это тяжело и требует времени. Лучший способ делать это – следить за оффициальным аккаунтом Vue в твиттере, читать оффициальные релизы версий и отслеживать публикации по Vue на профильных ресурсах, таких как мой канал @life_verstka.
Кроме того, сейчас вышел Vue 3 с массой новых функций, с которыми вы, возможно, захотите ознакомиться перед миграцией ваших проектов.