J'ai créé un composant React avec un tableau d'état. state.colors
qui contient trois valeurs hexagonales (l'état initial est ['#aaaaaa', '#aaaaaa', '#aaaaaa']
). Chaque valeur de la state.colors
peut être mis à jour à l'aide de sélecteurs de couleur. À titre de test, j'ai mis à jour la première couleur en rouge, la deuxième en vert et la troisième en bleu. Cela fonctionne comme prévu dans un composant de classe (comme le montre la capture d'écran ci-dessous).
class EditArtworkClass extends React.Component {
constructor(props) {
this.state = {
colors: initialPalette
};
}
setColor(index, hex) {
const clonedColors = _.clone(this.state.colors);
clonedColors[index] = hex;
this.setState(
{
colors: clonedColors
},
() => {
console.log("updated");
}
);
}
// other code here
}
Composante de classe - Avant de choisir les couleurs :
Composant de classe - Après avoir choisi les couleurs ( state.colors
ont les valeurs hexagonales correctes) :
Cependant, je suis confronté à un problème lorsque j'utilise un composant fonctionnel. Chaque fois que je mets à jour une couleur à l'aide du sélecteur de couleur, toutes les autres valeurs du composant fonctionnel colors
sont réinitialisés à la valeur initiale ( #aaaaaa
). Si je règle la première couleur sur le rouge, la deuxième sur le bleu et la troisième sur le vert, seule la dernière valeur dans le champ colors
aura le bon hexagone puisque les deux autres valeurs sont remises à zéro. #aaaaaa
lors de la mise à jour de la troisième couleur.
export default function EditArtworkFunctional() {
const [colors, setColors] = useState(initialPalette);
const setColor = (index, hex) => {
const clonedColors = _.clone(colors);
clonedColors[index] = hex;
return clonedColors;
};
// Other code here
}
Composant fonctionnel - Avant de choisir les couleurs :
Composante fonctionnelle - Après avoir choisi les couleurs (seule la dernière couleur que je choisis a un hexagone correct dans l'état) :
Notez que le sélecteur de couleur est un composant non contrôlé et qu'il affichera les couleurs que vous choisissez, et non pas la couleur de l'écran de l'utilisateur. colors
tableau d'état.
J'ai créé une mini-application reproductible dans le cadre du programme Lien vers Codesandbox ci-dessous.
Lien Condesandbox : https://codesandbox.io/s/class-vs-functional-component-array-state-8lnzd
Je n'ai aucune idée de la raison pour laquelle cela se produit, donc toute aide ou conseil serait grandement apprécié.
UPDATE : J'ai résolu le problème en utilisant la réponse de @TalOrlanczyk. L'astuce était de récupérer l'état précédent en utilisant le paramètre optionnel lors de la mise à jour. Vous pouvez voir le CodeSandbox repo de la version de travail ici .