В главе Проектирование формы состояния документы предлагают сохранить ваше состояние в объекте с ключом ID:
Держите каждую сущность в объекте, хранящемся с идентификатором в качестве ключа, и используйте идентификаторы для ссылки на другие сущности или списки.
Они переходят в состояние
Подумайте о состоянии приложений в качестве базы данных.
Я работаю над формой состояния для списка фильтров, некоторые из которых будут открыты (они отображаются во всплывающем окне) или имеют выбранные параметры. Когда я прочитал "Подумайте о состоянии приложений в качестве базы данных", я подумал о том, чтобы думать о них как о реакции JSON, поскольку он будет возвращен из API (сам подкрепленный базой данных).
Итак, я думал об этом как
[{
id: '1',
name: 'View',
open: false,
options: ['10', '11', '12', '13'],
selectedOption: ['10'],
parent: null,
},
{
id: '10',
name: 'Time & Fees',
open: false,
options: ['20', '21', '22', '23', '24'],
selectedOption: null,
parent: '1',
}]
Однако документы предлагают формат, более похожий на
{
1: {
name: 'View',
open: false,
options: ['10', '11', '12', '13'],
selectedOption: ['10'],
parent: null,
},
10: {
name: 'Time & Fees',
open: false,
options: ['20', '21', '22', '23', '24'],
selectedOption: null,
parent: '1',
}
}
В теории, это не имеет значения, если данные сериализуемы (под заголовком "Состояние" ).
Итак, я с удовольствием подошел к массиву объектов, пока я не писал свой редуктор.
При использовании подхода с привязкой к объекту (и либерального использования оператора спреда) часть OPEN_FILTER
редуктора становится
switch (action.type) {
case OPEN_FILTER: {
return { ...state, { ...state[action.id], open: true } }
}
В то время как при использовании подхода "массив-объект" он более подробный (и вспомогательная функция зависит)
switch (action.type) {
case OPEN_FILTER: {
// relies on getFilterById helper function
const filter = getFilterById(state, action.id);
const index = state.indexOf(filter);
return state
.slice(0, index)
.concat([{ ...filter, open: true }])
.concat(state.slice(index + 1));
}
...
Итак, мои вопросы трижды:
1) Является ли простота редуктора мотивацией для перехода с подхода, основанного на объекте? Существуют ли другие преимущества для этого состояния?
и
2) Похоже, что подход, основанный на объектах с ключом, затрудняет работу со стандартным JSON in/out для API. (Вот почему я пошел с массивом объектов в первую очередь.) Итак, если вы идете с этим подходом, вы просто используете функцию для преобразования ее вперед и назад между форматом JSON и форматом формы штата? Это кажется неуклюжим. (Хотя, если вы защищаете этот подход, является частью ваших рассуждений о том, что это менее clunky, чем редуктор массива объектов выше?)
и
3) Я знаю, что Дэн Абрамов разработал сокращение, чтобы теоретически быть агностиком государственной структуры данных (как предложено "По соглашению, состояние верхнего уровня является объектом или каким-либо другим ключом -значение, как карта, но технически это может быть любой тип," мой вклад). Но, учитывая вышеизложенное, просто "рекомендуется" сохранить объект, связанный с идентификатором, или есть другие непредвиденные болевые точки, с которыми я столкнусь, используя массив объектов, которые делают его таким, что я должен просто прервать это планировать и пытаться придерживаться объекта с ключом ID?