В библиотеке Shepherd.js каждый шаг (step) создаётся как объект с
набором параметров, определяющих его поведение, позиционирование и
контент. Контент шага задаётся через свойство text, которое
может быть строкой, функцией или HTML-разметкой. В процессе работы
приложения возникает необходимость динамического обновления содержимого
шага без пересоздания всего тура.
1. Метод updateStepOptions
Shepherd.js предоставляет метод updateStepOptions,
который позволяет изменить параметры уже существующего шага. Этот метод
принимает объект с новыми настройками:
tour.getCurrentStep().updateStepOptions({
text: "Обновлённый текст для текущего шага",
classes: "shepherd-theme-arrows custom-class"
});
text – новый контент шага. Может быть строкой или
функцией, возвращающей строку.classes – список CSS-классов, позволяющий динамически
менять стили шага.attachTo,
buttons, также могут быть изменены через этот метод.2. Динамическая генерация контента через функции
Свойство text может быть функцией, которая возвращает
строку. Это удобно для создания шагов с контентом, зависящим от
состояния приложения:
tour.addStep({
id: "dynamic-step",
text: () => `Текущее значение счётчика: ${counter}`,
attachTo: { element: "#counter", on: "bottom" }
});
При каждом открытии шага функция вызывается заново, что позволяет
отображать актуальную информацию без дополнительных вызовов
updateStepOptions.
Помимо текста, часто возникает потребность изменить кнопки шага. Для
этого используется тот же метод updateStepOptions:
tour.getCurrentStep().updateStepOptions({
buttons: [
{
text: "Назад",
action: tour.back
},
{
text: "Далее",
action: () => {
counter += 1;
tour.next();
}
}
]
});
Важно учитывать, что изменение кнопок происходит мгновенно, но визуально шаг нужно закрыть и снова открыть, если требуется полностью обновить его интерфейс.
После обновления контента иногда необходимо вызвать метод
show() для перерисовки шага:
const step = tour.getCurrentStep();
step.updateStepOptions({ text: "Новый контент" });
step.show();
Этот подход гарантирует, что изменения сразу отображаются пользователю, особенно если шаг уже был открыт.
Shepherd.js поддерживает события шагов: show,
hide, complete и другие. Можно использовать
событие show для динамического обновления текста и кнопок
перед отображением шага:
tour.addStep({
id: "event-step",
text: "Инициализация...",
attachTo: { element: "#element", on: "right" },
when: {
show: function() {
this.updateStepOptions({
text: `Обновлённый текст: счётчик = ${counter}`
});
}
}
});
this внутри обработчика ссылается на текущий шаг.Содержимое шага может требовать изменения позиции или элемента, к
которому он привязан. Для этого также используется
updateStepOptions:
step.updateStepOptions({
attachTo: { element: "#new-element", on: "top" }
});
step.show();
element – новый DOM-элемент для привязки шага.on – сторона, относительно которой шаг будет
позиционироваться (top, bottom,
left, right).updateStepOptions для небольших изменений
текста и кнопок, чтобы избежать полного пересоздания шага.text, что снижает количество вызовов обновления.show и before-show позволяют
синхронизировать шаг с состоянием интерфейса в момент его
отображения.show(), чтобы корректно перерисовать шаг на экране.updateStepOptions без
необходимости, так как это может влиять на производительность при
большом количестве шагов.const step = tour.getCurrentStep();
step.updateStepOptions({
text: () => `Текущее состояние: ${state.value}`,
buttons: [
{
text: "Обновить",
action: () => {
state.value += 1;
step.updateStepOptions({ text: `Текущее состояние: ${state.value}` });
}
},
{ text: "Закрыть", action: step.hide }
],
classes: "shepherd-theme-arrows updated-step"
});
step.show();
В этом примере обновляется одновременно текст, кнопки и классы, обеспечивая полный контроль над визуальной и функциональной частью шага без пересоздания.