Bliss.js предоставляет лёгкий и эффективный механизм работы с
состоянием приложения, позволяя управлять данными, их изменениями и
реакциями на эти изменения без громоздких паттернов. Центральным
элементом управления состоянием является объект Store,
который служит контейнером для данных и обеспечивает подписку на их
изменения.
Состояние создаётся через конструктор Bliss.Store:
const store = new Bliss.Store({
user: {
name: 'Алексей',
loggedIn: false
},
cart: []
});
Ключевые моменты:
Store может содержать вложенные объекты и массивы.Доступ к данным осуществляется через методы .get() или
прямое обращение к свойствам объекта состояния:
const username = store.get('user.name'); // 'Алексей'
const cartItems = store.get('cart'); // []
.get() поддерживает
dot-notation, что упрощает работу с вложенными
объектами.store.state.user.name, но использование .get()
обеспечивает защиту от ошибок при доступе к несуществующим ключам.Для изменения состояния применяется метод .set():
store.set('user.loggedIn', true);
store.set('cart', [...store.get('cart'), { id: 1, name: 'Товар' }]);
Особенности работы с .set():
store.set({
'user.name': 'Ирина',
'user.loggedIn': false
});
Bliss.js позволяет реагировать на изменение состояния через метод
.subscribe():
store.subscribe('user.loggedIn', (newValue, oldValue) => {
console.log(`Статус входа изменён: ${oldValue} → ${newValue}`);
});
Особенности подписок:
const unsubscribe = store.subscribe('cart', items => console.log(items));
unsubscribe(); // удаляет подписку
Bliss.js поддерживает вычисляемые свойства через метод
.computed():
store.computed('cartTotal', state => {
return state.cart.reduce((sum, item) => sum + item.price, 0);
});
console.log(store.get('cartTotal')); // вычисляемая сумма товаров
Особенности:
Для массивов доступны методы с автоматической реактивностью:
store.push('cart', { id: 2, name: 'Ещё товар', price: 500 });
store.splice('cart', 0, 1); // удаляет первый элемент
store.update('cart', item => item.id === 2 ? { ...item, price: 450 } : item);
push, splice, update
обеспечивают уведомление подписчиков о изменениях.Bliss.js позволяет отслеживать изменения не только верхнего уровня, но и вложенных объектов:
store.subscribe('user', user => {
console.log('Пользователь обновлён', user);
});
Bliss.js легко интегрируется с HTML через директивы или ручное связывание:
const nameInput = document.querySelector('#username');
store.subscribe('user.name', value => nameInput.value = value);
nameInput.addEventListener('input', e => {
store.set('user.name', e.target.value);
});
Для асинхронных операций Bliss.js использует промисы или async/await:
async function fetchUserData() {
const response = await fetch('/api/user');
const data = await response.json();
store.set('user', data);
}
Рекомендуется структурировать состояние по логическим модулям, что упрощает управление:
const store = new Bliss.Store({
user: { name: '', loggedIn: false },
cart: [],
products: [],
notifications: []
});
Bliss.js сочетает простоту и гибкость в управлении состоянием, позволяя строить как небольшие динамичные виджеты, так и масштабные интерфейсы с глубокой реактивностью и строгим контролем над данными. Взаимодействие с объектами состояния, массивами и вычисляемыми свойствами создаёт единый реактивный поток, минимизируя необходимость ручной синхронизации с DOM.