Shepherd.js — библиотека для создания интерактивных руководств по интерфейсу. Одним из ключевых аспектов её функциональности является управление состоянием (state), что позволяет контролировать поведение шагов, их видимость, активность кнопок и условия перехода.
В Shepherd.js состояние каждого шага и всего тура определяется набором ключевых параметров:
Эти состояния могут использоваться для динамического управления потоком тура в зависимости от действий пользователя или контекста приложения.
Состояние шага задаётся при его создании через объект конфигурации:
const tour = new Shepherd.Tour({
defaultStepOptions: {
classes: 'shepherd-theme-arrows',
scrollTo: true
}
});
tour.addStep({
id: 'intro',
text: 'Добро пожаловать в тур!',
buttons: [
{
text: 'Далее',
action: tour.next
}
],
when: {
show: () => console.log('Шаг intro показан')
},
enabled: true,
hidden: false
});
Здесь enabled и hidden управляют
доступностью и видимостью шага, а when.show позволяет
выполнять действия при активации шага.
Shepherd.js предоставляет методы для управления состоянием после создания шага:
step.show() — делает шаг видимым и активным.step.hide() — скрывает шаг.step.enable() / step.disable() — включает
или отключает шаг.step.complete() — отмечает шаг как выполненный.step.reset() — сбрасывает состояние шага к исходным
параметрам.Пример динамического управления:
tour.addStep({
id: 'feature-step',
text: 'Этот шаг появится только после выполнения предыдущего.',
buttons: [
{
text: 'Далее',
action: () => {
step.complete();
tour.next();
}
}
],
enabled: false
});
// Включение шага при выполнении условия
if (userHasCompletedTask) {
tour.getById('feature-step').enable();
}
Часто необходимо показывать или скрывать шаги на основе действий
пользователя. Для этого используют комбинацию свойств
enabled, hidden и событий
when:
tour.addStep({
id: 'conditional-step',
text: 'Этот шаг виден только если выполнено условие',
hidden: true,
when: {
show: () => console.log('Conditional step показан')
}
});
// Условное отображение
if (userHasAccess) {
const step = tour.getById('conditional-step');
step.hidden = false;
step.show();
}
Shepherd.js позволяет управлять состоянием не только отдельных шагов, но и всего тура. Тур может находиться в состояниях:
События тура можно использовать для синхронизации состояния интерфейса:
tour.on('start', () => console.log('Тур запущен'));
tour.on('complete', () => console.log('Тур завершен'));
tour.on('cancel', () => console.log('Тур отменен'));
Комбинируя эти события с состоянием шагов, можно строить сложную логику, например, повторное прохождение шагов только при определённых условиях.
Для адаптивных туров удобно сохранять состояние шагов между сессиями. Shepherd.js позволяет интегрировать внешние хранилища (localStorage, IndexedDB, Redux):
tour.on('complete', () => {
localStorage.setItem('tourCompleted', 'true');
});
if (localStorage.getItem('tourCompleted') === 'true') {
tour.getById('intro').disable();
}
Таким образом, можно создавать туры, которые запоминают прогресс пользователя и показывают только релевантные шаги.
Состояние в Shepherd.js тесно связано с действиями, которые выполняются на шаге. Примеры:
buttons: [
{
text: 'Далее',
action: tour.next,
disabled: true
}
]
when: {
show: () => {
if (userCompletedAction) tour.next();
}
}
step.updateStepOptions({
buttons: [
{
text: userHasCompletedAction ? 'Завершить' : 'Пропустить',
action: tour.next
}
]
});
Эти методы позволяют строить полностью интерактивные, контекстно-зависимые туры.
Управление состоянием в Shepherd.js — это сочетание свойств
enabled, hidden, completed,
методов шагов и глобальных событий тура. Правильное использование этих
инструментов позволяет создавать интерактивные, адаптивные и
условно-зависимые туры, которые подстраиваются под действия пользователя
и сохраняют прогресс между сессиями, обеспечивая гибкость и высокое
качество UX.