Моя модель состояния верхнего уровня выглядит следующим образом:
{
listOfItems: [], // Item[]
selections: {
itemId: 0
}
}
Список товаров может содержать 10 различных товаров. Когда пользователь нажимает на элемент, он обновляет выбор, и мой @Selector
будет перезапущен.
Действие: Установить выбор элемента
@Action(Item.Select)
setState(
{ setState }: StateContext<ItemsModel>,
{ itemId }: Item.Select
) {
setState(patch({ selections: patch({ itemId }) }));
}
Селектор: Выберите текущий элемент
@Selector()
static getSelectedItem(state: ItemModel): Item {
return state.itemList.find(i => i.itemId === state.selections.itemId);
}
Проблема в : у меня есть до 20 действий для выполнения выбранного элемента. В результате:
- Множество
.find()
поисков для поиска элемента в исходном массиве (как селектора, так и действий) - Действия, выполняемые на
listOfItems
, совпадают поместите как те, что нужно выполнить для указанного c Item
Я хотел бы : сохранить массив и выбор в этом состоянии, но отделить «выбранный элемент» на новое подсостояние, где моделью дочернего состояния может быть просто тип элемента. Таким образом, я могу инкапсулировать все действия над Item в другом месте, чем действия над массивом Items [].
Я не уверен, как их синхронизировать c. Мне нужно поддерживать состояние «selectedItem» в актуальном состоянии при изменении itemId выбора в родительском элементе. Мне также нужно убедиться, что любые мутации в selectedItem отражены в исходном массиве в родительском.