Каков пример нормализации состояния в приложении React Redux?
Я читаю редукторы Redux docs и не понимаю, как нормализация состояния будет работать. Текущее состояние в Примере таково:
{
visibilityFilter: 'SHOW_ALL',
todos: [
{
text: 'Consider using Redux',
completed: true,
},
{
text: 'Keep all state in a single tree',
completed: false
}
]
}
можете ли вы привести пример того, как будет выглядеть выше, если мы последуем ниже?
для пример, сохраняя todosById: {id - > todo } и todos: array внутри государство было бы лучшей идеей в реальном приложении, но мы сохраняем пример простой.
2 ответов
этот пример прямо из Normalizr.
[{
id: 1,
title: 'Some Article',
author: {
id: 1,
name: 'Dan'
}
}, {
id: 2,
title: 'Other Article',
author: {
id: 1,
name: 'Dan'
}
}]
можно нормализовать таким образом -
{
result: [1, 2],
entities: {
articles: {
1: {
id: 1,
title: 'Some Article',
author: 1
},
2: {
id: 2,
title: 'Other Article',
author: 1
}
},
users: {
1: {
id: 1,
name: 'Dan'
}
}
}
}
в чем преимущество нормализации?
вы можете извлечь точную часть дерева состояния, которое вы хотите.
например - у вас есть массив объектов, содержащих информацию о статьях. Если вы хотите выбрать конкретный объект из этого массива, вам придется перебрать всю матрица. В худшем случае желаемый объект отсутствует в массиве. Чтобы преодолеть это, мы нормализуем данные.
чтобы нормализовать данные, сохраните уникальные идентификаторы каждого объекта в отдельном массиве. Назовем этот массив results
.
result: [1, 2, 3 ..]
и преобразовать массив объектов в объект с ключами как id
(см. второй фрагмент). Назовите этот объект entities
.
в конечном счете, чтобы получить доступ к объекту с id
1, просто сделать это- entities.articles["1"]
.
можно использовать normalizr для этого.
Normalizr принимает JSON и схему и заменяет вложенные сущности их идентификаторами, собирая все сущности в словари.
например,
[{
id: 1,
title: 'Some Article',
author: {
id: 1,
name: 'Dan'
}
}, {
id: 2,
title: 'Other Article',
author: {
id: 1,
name: 'Dan'
}
}]
можно нормализовать до
{
result: [1, 2],
entities: {
articles: {
1: {
id: 1,
title: 'Some Article',
author: 1
},
2: {
id: 2,
title: 'Other Article',
author: 1
}
},
users: {
1: {
id: 1,
name: 'Dan'
}
}
}
}