Жизненный цикл тура в Shepherd.js представляет собой последовательность состояний и событий, через которые проходит объект тура и его шаги. Управление этим циклом позволяет точно контролировать поведение интерфейса, синхронизировать действия пользователя и логику приложения.
Ключевые сущности:
Тур последовательно проходит несколько базовых состояний:
Инициализация
Shepherd.TourГотовность (idle)
Запуск (start)
tour.start()Активное выполнение
next, back)Завершение
complete)cancel)Создание тура задаёт основу жизненного цикла:
const tour = new Shepherd.Tour({
defaultStepOptions: {
cancelIcon: {
enabled: true
},
classes: 'shepherd-theme-arrows',
scrollTo: true
},
useModalOverlay: true
});
Особенности этапа:
Каждый шаг имеет собственный жизненный цикл, вложенный в цикл тура:
tour.addStep({
id: 'example-step',
text: 'Описание шага',
attachTo: {
element: '.example',
on: 'bottom'
},
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
Этапы жизни шага:
Shepherd.js предоставляет мощную систему событий:
start — тур запущенcomplete — успешно завершёнcancel — отменёнshow — показ шагаhide — скрытие шагаПример подписки:
tour.on('start', () => {
console.log('Тур начался');
});
tour.on('complete', () => {
console.log('Тур завершён');
});
step.on('show', () => {
console.log('Шаг показан');
});
Практическое применение:
Метод запуска:
tour.start();
Происходит:
Особенность: если элемент шага отсутствует в DOM, шаг может не отобразиться — важно учитывать асинхронную загрузку интерфейса.
Shepherd управляет переходами через методы:
tour.next();
tour.back();
tour.show('step-id');
Во время перехода:
Частая проблема — элементы ещё не отрисованы.
Решение — использовать beforeShowPromise:
tour.addStep({
id: 'async-step',
text: 'Асинхронный шаг',
attachTo: {
element: '.dynamic-element',
on: 'bottom'
},
beforeShowPromise: function () {
return new Promise(resolve => {
setTimeout(resolve, 500);
});
}
});
Назначение:
tour.complete();
tour.cancel();
complete, но с другим событиемShepherd не требует полного уничтожения объекта тура:
start()Однако при сложной логике рекомендуется:
Жизненный цикл тура часто связан с состоянием приложения:
Типичные сценарии:
Пример:
if (!localStorage.getItem('tourSeen')) {
tour.start();
localStorage.setItem('tourSeen', true);
}
В SPA (React, Vue и др.) жизненный цикл тура должен учитывать:
Подходы:
Наиболее распространённые:
1. Элемент не найден
beforeShowPromise2. Тур запускается слишком рано
3. Потеря состояния при переходе
Shepherd позволяет внедрять собственную логику:
Пример кастомного действия:
buttons: [
{
text: 'Далее',
action: () => {
console.log('Переход');
tour.next();
}
}
]
Жизненный цикл тура напрямую связан с UX:
Ключевые настройки:
useModalOverlayscrollTocanClickTargetПрактические рекомендации:
Каждый шаг зависит от:
Цикл шага:
Tour:
init → start → step transitions → complete/cancel
Step:
create → prepare → show → interact → hide → destroy
Такая модель позволяет гибко управлять поведением интерактивных подсказок, обеспечивая стабильную работу даже в сложных интерфейсах.