Введение| Начало работы | Изменение состояния | Демо

Единственное место, где состояние должно быть изменено, находится внутри метода «реакции». Внутри реакции вы можете получить состояние с помощью hub.state

Состояние Hub Flow на самом деле является просто объектом Freezer.js. Ознакомьтесь с их README для получения полной документации. Читая документацию Freezer, помните, что freezer.get() === hub.state.

В примерах я буду использовать следующее состояние приложения:

{
  bookmarks: [
    { name: "Google", url: "www.google.com" },
    { name: "Github", url: "https://github.com" } 
   ],
  activeBookmark: { name: "", url: "" }
}

Обновить объект

Все объекты (даже глубоко вложенные) имеют метод .set(<updates>). Этот метод работает так же, как React.Component.setState()in, то есть не заменяет объект, а просто обновляет указанные свойства.

Обновить одно свойство

hub.state.activeBookmark.set({ name: "New Value" });

Обновить несколько свойств

hub.state.activeBookmark.set({ name: "New Value", url: "#" })

Обновить объект в массиве

hub.state.bookmarks[0].set({ name: "New Value"});

Заменить объект

Вы можете вызвать .reset(), если хотите полностью заменить объект. Это полезно, если вы хотите удалить все свойства без явного указания их в .set().

var bookmark = { name: "no url prop" };
// hub.state.activeBoomark.url === "#"
hub.state.activeBookmark.reset(bookmark);
// hub.state.activeBoomark.url === undefined
// This would effective work as a replace too
hub.state.set({
  activeBookmark: bookmark
});

Работа с массивами

Массивы внутри hub.state также неизменяемы, но Freezer.js реализует большинство стандартных методов массива, поэтому вам не нужно изучать новый API (например, Immutable.js). Другие методы массива.

Добавить элемент в конец массива, .push(<item>)

hub.state.bookmarks.push(newBookmark);

Добавить элемент в начало массива, .unshift(<item>)

hub.state.bookmarks.unshift(newBookmark);

Удалить элемент из массива

// Given a key, filter out the item with that key
var keyToRemove = "123";
hub.state.set({ 
  bookmarks: hub.state.bookmarks.filter(b => b.key !== key)
})


hub-flow-demo — StackBlitz
Простой менеджер закладок для демонстрации шаблона управления состоянием Hub Flow.stackblitz.com