Изменение порядка следования объектов в нормализованной структуре данных Redux

#reactjs #redux

#reactjs #redux

Вопрос:

У меня есть нормализованная структура данных Redux, индексируемая идентификатором строки. Среди прочих свойств каждый объект в состоянии имеет sequenceNumber , которое используется для отображения его по порядку в списке или таблице. Элементы можно перетаскивать, чтобы изменить их порядок.

Я изо всех сил пытаюсь найти аккуратный, чистый подход к обновлению порядковых номеров. Какой хороший способ сделать это в Redux reducer?


Моя текущая state структура данных по существу:

 {
    'asdf': { title: 'Item 1', sequence: 0, ... },
    '1234': { title: 'Item 2', sequence: 1, ... },
    'zzzz': { title: 'Item 3', sequence: 2, ... }
}
  

Мое действие заключается

 { type: REORDER_ITEMS, oldRow: 1, newRow: 0 }
  

Что должно привести к состоянию

 {
    'asdf': { title: 'Item 1', sequence: 1, ... },
    '1234': { title: 'Item 2', sequence: 0, ... },
    'zzzz': { title: 'Item 3', sequence: 2, ... }
}
  

Мой текущий редуктор использует Object.keys(state).reduce() для перебора элементов и изменения sequence одного за другим, в зависимости от того, равны ли они, больше или меньше желаемых номеров строк. Есть ли более аккуратный способ управлять этим?

Ответ №1:

Вы могли бы сделать еще один шаг к нормализации: извлечь последовательность в отдельный фрагмент состояния и сохранить порядок в виде массива идентификаторов.

 {
  items : {
    'asdf': { title: 'Item 1', ... },
    '1234': { title: 'Item 2', ... },
    'zzzz': { title: 'Item 3', ... }
  },
  sequence: ['1234', 'asdf', 'zzzz']
}
  

Таким образом, у вас мог бы быть отдельный редуктор для обработки действий, изменяющих вашу последовательность, только с использованием операций с массивами.

Комментарии:

1. Да, приведенный исходный пример на самом деле не полностью нормализован. Стандартной практикой является наличие таблицы поиска элементов по идентификаторам и отслеживание порядка элементов с использованием массивов. Смотрите раздел «Структурирующие редукторы» в Redux docs для получения более подробной информации по этой теме: redux.js.org/docs/recipes/StructuringReducers.html .

2. Упс, наверное, следовало подумать об этом самому! Спасибо