Riot.js активно использует реактивность и событийное взаимодействие компонентов, что делает понимание Observer и Publisher-Subscriber паттернов критически важным для построения масштабируемых приложений.
Observer (наблюдатель) — это паттерн проектирования, в котором один объект (субъект) уведомляет множество зависимых объектов (наблюдателей) об изменениях своего состояния. В контексте Riot.js это реализуется через реактивные данные и биндинг компонентов.
Ключевые особенности:
this.observable() или реактивный объект,
автоматически отслеживается.Пример:
import { observable } from 'riot';
// Создание наблюдаемого объекта
const state = observable({ count: 0 });
// Подписка на изменения
state.on('update', (key, value) => {
console.log(`Свойство ${key} изменено на ${value}`);
});
// Изменение состояния
state.count = 1; // Лог: "Свойство count изменено на 1"
В этом примере observable автоматически уведомляет всех
подписчиков о любом изменении. Riot.js обеспечивает тонкую
гранулярность уведомлений: можно отслеживать отдельные
свойства, что минимизирует лишние обновления интерфейса.
Publisher-Subscriber (Pub-Sub) — это паттерн, где издатели (publishers) рассылают события, а подписчики (subscribers) на них реагируют. В отличие от прямого Observer, здесь отправитель и получатель полностью независимы, что повышает модульность.
Особенности реализации в Riot.js:
riot.observable(): один объект может выступать как
централизованный шина событий.Пример:
import { observable } from 'riot';
// Создание глобального события
const bus = observable();
// Компонент A публикует событие
function increment() {
bus.trigger('increment', 1);
}
// Компонент B подписывается на событие
bus.on('increment', (value) => {
console.log(`Пришло событие increment с значением ${value}`);
});
increment(); // Лог: "Пришло событие increment с значением 1"
Здесь bus выступает как шина событий,
обеспечивая независимость компонентов. Подобная архитектура позволяет
строить сложные приложения с большим количеством взаимосвязанных
компонентов без жёсткой связки между ними.
| Характеристика | Observer | Pub-Sub |
|---|---|---|
| Связь между объектами | Прямая, наблюдатель знает субъект | Косвенная, через шину событий |
| Цель | Автоматическое обновление состояния | Асинхронная передача событий |
| Использование в Riot.js | Реактивные свойства компонентов | Межкомпонентное взаимодействие |
| Пример | observable({ count: 0 }) |
bus.trigger('event') / bus.on() |
Observer чаще применяется для внутренних данных компонента, где важно мгновенное обновление интерфейса. Pub-Sub используют для связи между компонентами, особенно при масштабной структуре приложения.
user:update, cart:add) для
уменьшения коллизий.off при уничтожении компонента, чтобы избежать утечек
памяти.bus.off('increment');
this.observable() внутри компонента создаёт объект,
уведомляющий только подписчиков текущего компонента.
riot.observable() создаёт глобальный объект
событий, который можно использовать как шину для всего
приложения.
Методы:
on(event, handler) — подпискаoff(event, handler) — отпискаtrigger(event, ...args) — публикация событияЭта структура позволяет легко реализовать сложную реактивную логику, где одни компоненты обновляются локально, а другие — реагируют на глобальные события.