我有一个由字符串ID索引的规范化Redux数据结构。在其他属性中,状态中的每个对象都有一个sequenceNumber
,用于在列表或网格中按顺序显示它。可以拖放项目以重新排序。
我正在努力寻找一个整洁,纯粹的方法来更新序列号。在Redux减速器中做这件事的好方法是什么?
我当前的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
,这取决于它们是否等于、大于或小于所需的行号。有没有更简洁的方法来处理这个问题?
您可以进一步规范化:在单独的状态片中提取序列,并将顺序存储为id数组。
{
items : {
'asdf': { title: 'Item 1', ... },
'1234': { title: 'Item 2', ... },
'zzzz': { title: 'Item 3', ... }
},
sequence: ['1234', 'asdf', 'zzzz']
}
这样,您就可以有一个单独的reducer来处理修改序列的操作,而只使用数组操作。