Object.assign()
est une solution facile, mais son utilisation (actuellement) la meilleure réponse - bien qu'elle soit très bien pour créer des composants sans état, causera des problèmes pour l'objectif souhaité de l'OP de fusionner deux state
objets.
Avec deux arguments, Object.assign()
va en fait muter le premier objet en place, affectant les instanciations futures.
Ex:
Considérez deux configurations de style possibles pour une boîte:
var styles = {
box: {backgroundColor: 'yellow', height: '100px', width: '200px'},
boxA: {backgroundColor: 'blue'},
};
Nous voulons donc que toutes nos boîtes aient des styles de boîte par défaut, mais nous voulons en remplacer certaines avec une couleur différente:
// this will be yellow
<div style={styles.box}></div>
// this will be blue
<div style={Object.assign(styles.box, styles.boxA)}></div>
// this SHOULD be yellow, but it's blue.
<div style={styles.box}></div>
Une fois Object.assign()
exécuté, l'objet 'styles.box' est définitivement changé.
La solution est de passer un objet vide à Object.assign()
. Ce faisant, vous dites à la méthode de produire un nouvel objet avec les objets que vous lui avez transmis. Ainsi:
// this will be yellow
<div style={styles.box}></div>
// this will be blue
<div style={Object.assign({}, styles.box, styles.boxA)}></div>
// a beautiful yellow
<div style={styles.box}></div>
Cette notion d'objets en mutation sur place est critique pour React, et une bonne utilisation de Object.assign()
est vraiment utile pour utiliser des bibliothèques comme Redux.