Shepherd.js предоставляет мощный механизм для управления пользовательскими турами по интерфейсу с помощью хуков расширения. Хуки позволяют внедрять дополнительную логику на разных этапах жизни тура и отдельных шагов, обеспечивая гибкость и контроль над поведением компонентов.
В Shepherd.js доступны несколько категорий хуков:
beforeShow / afterShow – вызываются перед отображением и после отображения шага тура. Позволяют изменять элементы DOM, проверять условия отображения, запускать анимации или логировать события.
beforeHide / afterHide – срабатывают перед скрытием и после скрытия шага. Используются для очистки состояний, скрытия всплывающих элементов или остановки процессов, инициированных на шаге.
beforeComplete / afterComplete – активируются перед завершением шага или всего тура и после него. Позволяют сохранять пользовательские данные, запускать переходы к следующему шагу или уведомления.
beforeCancel / afterCancel – вызываются при отмене шага или тура. Обеспечивают корректное удаление временных данных и сброс состояния интерфейса.
Хуки могут быть определены как на уровне тура, так и на уровне отдельных шагов.
На уровне тура:
const tour = new Shepherd.Tour({
useModalOverlay: true,
defaultStepOptions: {
cancelIcon: {
enabled: true
}
}
});
tour.on('before-show', function(step) {
console.log(`Сейчас будет показан шаг: ${step.id}`);
});
tour.on('after-complete', function() {
console.log('Тур завершён');
});
На уровне шага:
tour.addStep({
id: 'intro',
text: 'Добро пожаловать в приложение',
buttons: [
{
text: 'Далее',
action: tour.next
}
],
beforeShowPromise: function() {
return new Promise(resolve => {
// асинхронная логика перед отображением шага
setTimeout(() => {
console.log('Шаг готов к показу');
resolve();
}, 500);
});
},
afterShow: function() {
console.log('Шаг отображён');
}
});
Shepherd.js поддерживает асинхронные хуки, возвращающие промисы. Это позволяет выполнять операции, которые требуют времени: загрузка данных с сервера, анимация элементов или проверка условий пользователя. Асинхронные хуки гарантируют, что шаг не будет показан, пока промис не завершится.
tour.addStep({
id: 'async-step',
text: 'Подождите немного...',
beforeShowPromise: async function() {
await fetchData();
console.log('Данные загружены, шаг можно показать');
}
});
Использование хуков позволяет хранить и изменять состояние тура:
tour.on('before-show', function(step) {
const isAdmin = checkUserRole();
if (!isAdmin && step.id === 'admin-step') {
step.hide(); // скрываем шаг, если пользователь не администратор
}
});
Можно комбинировать хуки на уровне тура и отдельных шагов. Shepherd.js сначала вызывает хуки шага, затем глобальные хуки тура. Такая последовательность обеспечивает гибкий контроль: шаг может модифицировать свои действия, а тур управлять общим поведением.
tour.addStep({
id: 'step1',
text: 'Пример комбинации хуков',
beforeShow: function() { console.log('Локальный beforeShow'); }
});
tour.on('before-show', function(step) { console.log('Глобальный beforeShow'); });
Результат выполнения: локальный beforeShow шага
выполняется перед глобальным хуком тура, что позволяет настраивать
поведение каждого шага индивидуально и при этом сохранять общий контроль
над туром.
afterShow и
afterHide, чтобы не задерживать взаимодействие пользователя
с интерфейсом.Хуки расширения Shepherd.js — это гибкий инструмент для создания интерактивных, динамичных и адаптивных туров, которые реагируют на состояние приложения и действия пользователя. Правильное применение хуков позволяет добиться максимальной кастомизации поведения шагов и всего тура без модификации исходного кода библиотеки.