Глобальное состояние приложения является ключевым элементом архитектуры при работе с компонентами в Slim.js. Slim.js предоставляет легковесные инструменты для управления состоянием и реактивности без необходимости подключения больших фреймворков, что делает подход особенно эффективным для SPA и динамических интерфейсов.
Для организации глобального состояния используется объект, который может быть подписан компонентами. Slim.js не навязывает строго структуру, но рекомендуется создавать отдельный модуль состояния, чтобы избежать тесной связки компонентов и состояния.
// state.js
export const appState = {
count: 0,
user: null,
todos: []
};
Объект appState можно расширять и модифицировать,
добавляя новые свойства по мере роста приложения. Главное — сохранять
единый источник правды, чтобы компоненты могли подписываться на
изменения.
Slim.js позволяет создавать реактивные свойства, которые
автоматически обновляют интерфейс при изменении состояния. Для этого
используется встроенный метод observe.
import { appState } from './state.js';
Slim.observe(appState, 'count', (newValue, oldValue) => {
console.log(`Count изменился с ${oldValue} на ${newValue}`);
});
Любое изменение свойства count вызовет функцию обратного
вызова. Это позволяет компонентам реагировать на изменения без ручного
вмешательства в DOM.
Компоненты Slim.js могут подписываться на глобальное состояние с помощью декораторов или методов жизненного цикла. Например, для классовых компонентов:
import { Slim, appState } from './state.js';
class CounterComponent extends Slim {
get template() {
return `<div>
<span>${this.count}</span>
<button oncl ick="increment()">Increment</button>
</div>`;
}
onBeforeMount() {
Slim.observe(appState, 'count', (newValue) => {
this.count = newValue;
this.update();
});
}
}
function increment() {
appState.count += 1;
}
Slim.define('counter-component', CounterComponent);
В этом примере CounterComponent реагирует на изменение
глобального состояния count. Метод update()
инициирует перерендер компонента только при необходимости.
Для больших приложений состояние обычно делится на модули:
export const userState = {
current: null,
isAuthenticated: false
};
export const todoState = {
items: [],
filter: 'all'
};
Каждый модуль можно подписывать независимо, что упрощает управление зависимостями и снижает риск непреднамеренных изменений в других частях приложения.
export function addTodo(item) {
appState.todos.push(item);
Slim.notify(appState, 'todos');
}
Slim.observe, позволяющее компонентам автоматически
обновляться при изменении данных.Slim.notify, если требуется оповестить компоненты вручную
после сложных операций.export const appState = {
user: { name: '', role: '' },
notifications: [],
todos: [],
settings: { theme: 'light', language: 'ru' }
};
// Подписка на изменения темы
Slim.observe(appState.settings, 'theme', (newTheme) => {
document.body.setAttribute('data-theme', newTheme);
});
В этом примере глобальное состояние охватывает сразу несколько аспектов приложения: пользователя, уведомления, задачи и настройки интерфейса. Подписка на изменение темы позволяет динамически менять внешний вид приложения без вмешательства в отдельные компоненты.
Глобальное состояние в Slim.js становится центральной точкой управления данными, обеспечивая согласованность интерфейса, реактивность и масштабируемость.