Shepherd.js предоставляет удобный механизм создания интерактивных пошаговых руководств, но для сложных приложений важно сохранять прогресс пользователя между сессиями. Это позволяет возобновлять тур с того места, на котором пользователь остановился, а также адаптировать опыт под индивидуальные действия.
complete и cancelКаждый тур в Shepherd.js поддерживает события, которые могут быть использованы для сохранения состояния:
const tour = new Shepherd.Tour({
defaultStepOptions: {
classes: 'shepherd-theme-arrows'
}
});
tour.addStep({
id: 'step-1',
text: 'Первый шаг тура',
attachTo: { element: '#step1', on: 'bottom' },
});
tour.on('complete', () => {
localStorage.setItem('tourState', 'completed');
});
tour.on('cancel', () => {
localStorage.setItem('tourState', 'cancelled');
});
Здесь localStorage используется для постоянного хранения
состояния. Можно использовать и sessionStorage для хранения
только в рамках текущей сессии.
Для возможности возобновления тура с конкретного шага необходимо сохранять индекс текущего шага при каждом переходе:
tour.on('show', (event) => {
const currentStepId = event.step.id;
localStorage.setItem('currentStep', currentStepId);
});
При следующем запуске тура можно проверить сохранённое значение и
вызвать tour.show() с соответствующим шагом:
const savedStepId = localStorage.getItem('currentStep');
if (savedStepId) {
tour.start();
const step = tour.getById(savedStepId);
if (step) step.show();
} else {
tour.start();
}
Если требуется сохранять состояние для пользователя между устройствами, можно использовать API-запросы на сервер:
tour.on('show', (event) => {
const stepId = event.step.id;
fetch('/api/save-tour-progress', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId: '123', stepId })
});
});
В этом случае сервер может хранить идентификатор шага в базе данных и возвращать его при следующей загрузке страницы, чтобы возобновить тур.
Shepherd.js позволяет добавлять кастомные кнопки с функциями. Состояние этих действий также можно сохранять:
tour.addStep({
id: 'step-2',
text: 'Выберите вариант:',
attachTo: { element: '#step2', on: 'top' },
buttons: [
{
text: 'Вариант A',
action: () => {
localStorage.setItem('choiceStep2', 'A');
tour.next();
}
},
{
text: 'Вариант B',
action: () => {
localStorage.setItem('choiceStep2', 'B');
tour.next();
}
}
]
});
Позже можно прочитать localStorage и адаптировать
интерфейс на основании сделанного выбора.
Для сброса тура после его завершения или по запросу пользователя необходимо удалять сохранённые данные:
tour.on('complete', () => {
localStorage.removeItem('currentStep');
localStorage.removeItem('choiceStep2');
localStorage.setItem('tourState', 'completed');
});
tour.on('cancel', () => {
localStorage.clear();
});
Такой подход предотвращает конфликт старого состояния с новым запуском тура.
Если шаги тура создаются динамически, полезно хранить состояние в формате массива:
const stepsState = [];
tour.on('show', (event) => {
const stepIndex = tour.steps.indexOf(event.step);
if (!stepsState.includes(stepIndex)) {
stepsState.push(stepIndex);
localStorage.setItem('stepsState', JSON.stringify(stepsState));
}
});
Это позволяет восстановить все просмотренные шаги и управлять прогрессом более гибко.
JSON.stringify и JSON.parse
для хранения сложных объектов в localStorage.Система сохранения состояния в Shepherd.js позволяет создавать гибкие и персонализированные туры, повышая удобство взаимодействия пользователя с приложением и улучшая UX.