J'ai une réponse API qui a beaucoup d'entités imbriquées. J'utilise normalizr pour maintenir l'état de redux aussi plat que possible.
Par exemple. la réponse api ressemble ci-dessous:
Redux + Normalizr: Ajouter et supprimer des entités normalisées dans l'état Redux
{
"id": 1,
"docs": [
{
"id": 1,
"name": "IMG_0289.JPG"
},
{
"id": 2,
"name": "IMG_0223.JPG"
}
],
"tags": [
{
"id": "1",
"name": "tag1"
},
{
"id": "2",
"name": "tag2"
}
]
}
Cette réponse est normalisée à l'aide normalizr
en utilisant le schéma ci-dessous:
const OpeningSchema = new schema.Entity('openings', {
tags: [new schema.Entity('tags')],
docs: [new schema.Entity('docs')]
});
et ci-dessous est à quoi il ressemble alors:
{
result: "1",
entities: {
"openings": {
"1": {
"id": 1,
"docs": [1,2],
"tags": [1,2]
}
},
"docs": {
"1": {
id: "1",
"name": "IMG_0289.JPG"
},
"2": {
id: "2",
"name": "IMG_0223.JPG"
}
},
"tags": {
"1": {
"id": 1,
"name": "tag1"
},
"2": {
"id": 2,
"name": "tag2"
}
}
}
}
L'état de redux ressemble maintenant à quelque chose comme ci-dessous:
state = {
"opening" : {
id: 1,
tags: [1,2],
docs: [1,2]
},
"tags": [
{
"id":1,
"name": "tag1"
},
{
"id":2,
"name": "tag2"
}
],
"docs": [
{
"id":1,
"name": "IMG_0289.JPG"
},
{
"id":2,
"name": "IMG_0223.JPG"
}
]
}
Maintenant, si j'envoie une action pour ajouter un tag
, il ajoute un objet tag
-state.tags
mais il ne met pas à jour tableau state.opening.tags
. Même comportement lors de la suppression d'une balise. Je conserve opening
, tags
et docs
dans trois réducteurs différents.
Ceci est une incohérence dans l'état. Je peux penser à des façons suivantes pour maintenir l'état cohérent:
- J'envoie une action à mettre à jour les balises et l'écouter à la fois réducteur et
tags
opening
réducteur et les balises de mise à jour par la suite aux deux endroits. - La demande de correctif pour mettre à jour l'ouverture avec des étiquettes renvoie la réponse d'ouverture. Je peux à nouveau envoyer l'action qui normalise la réponse et définir les balises, l'ouverture etc. avec une cohérence appropriée.
Quelle est la bonne façon de faire cela. Les entités ne devraient-elles pas observer les changements apportés aux entités liées et effectuer les changements eux-mêmes? Ou il existe d'autres modèles qui pourraient être suivis une telle action.