J'ai une classe très basique Person
qui nécessite un paramètre appelé data
.Modification des propriétés de classe avec Object.assign mais renvoi de l'instance de classe
class Person implements PersonInterface {
constructor(public data) {
}
get name(): string {
return this.data.name;
}
}
const person: PersonInterface = new Person({ name: "Aristona });
Dans mon magasin Redux, je conserve toutes les personnes dans un tableau. Il ressemble à ceci:
[Person, Person, Person, Person]
L'utilisateur peut modifier la propriété d'un nom Person
. Donc, mon réducteur ressemble à ceci:
case Constants.PERSON_UPDATE_SUCCESS:
const person = Object.assign({}, action.payload.person.data, {
name: action.payload.name
});
return {
...state,
persons: [
person,
...state.persons.filter(p => p.id !== person.id)
]
};
Il ne fonctionne pas parce que Object.assign
retourne la propriété data
. Ce dont j'ai besoin est Person
objet avec data
propriété mise à jour. Si je pouvais muter les données, il ressemblerait à ceci:
person.name = action.payload.name;
Sinon, mon personnes tableau ressemble à ceci:
[Person, Person, Person, Person, Object] // Object is data
et il brise toutes les itérations.
J'ai essayé de faire ceci:
const updatedData = Object.assign({}, action.payload.person.data, {
name: action.payload.name
});
const person: PersonInterface = new Person(updatedData);
Alors qu'en théorie, il travaillerait, malheureusement, je ne peux pas instancier une classe comme cela sans apporter des changements majeurs sur mes PersonFactory
classes.
Existe-t-il un moyen d'y parvenir sans casser l'immuabilité de Redux?
Merci.
Si vous voulez vraiment utiliser des classes, je vous recommande de créer simplement une nouvelle instance de la classe en utilisant 'new'. – Sulthan
Réagir et surtout redoubler une approche plus fonctionnelle plutôt qu'objective. Je ne peux pas penser à un bon moyen de faire ce que vous essayez de faire, malheureusement.Je dois demander, avez-vous vraiment besoin d'utiliser des classes pour votre état? L'état est juste une structure de données et ne bénéficierait pas vraiment d'être une instance de classe. – DonovanM
Voir ma réponse sur pourquoi l'utilisation de classes pour les données dans Redux est déconseillée: https://stackoverflow.com/questions/44268317/clone-and-then-mutate-approach-in-redux/44270061#44270061. – markerikson