J'ai une certaine confusion à propos de l'utilisation de Object.assign
pour React et Redux.
J'ai lu cet article article .
ES6 n'est pas pris en charge par tous les navigateurs, mais j'ai commencé à l'utiliser.
J'ai deux questions:
Object.assign
?Mon code
export const selectDiameter = (scaleData, size) => {
return {
type: SELECT_DIAMETER,
payload: Object.assign({}, scaleData, {
diameter: Object.assign({}, scaleData.diameter, {
selected_tube_diameter: size,
is_clicked: true,
audio: Object.assign({}, scaleData.diameter.audio, {
is_played: true
})
})
})
}
}
Quelle est l'alternative pour le code ci-dessus?
Redux docs vous recommande d’utiliser l’approche de l’opérateur de propagation au lieu du Object.assign
Selon les docs:
Une autre approche consiste à utiliser la syntaxe de propagation d'objet proposée pour les prochaines versions de JavaScript qui vous permettent d'utiliser la propagation (...) opérateur pour copier les propriétés énumérables d'un objet vers un autre de manière plus succincte. L'opérateur de propagation d'objet est conceptuellement similaire à l'opérateur de propagation de matrice ES6
L'avantage d'utiliser la syntaxe de propagation d'objet devient plus évident lorsque vous composez des objets complexes
Utilisation de la syntaxe d'opérateur Spread
export const selectDiameter = (scaleData,size) => {
return {
type: SELECT_DIAMETER,
payload: {...scaleData,
diameter: {
...scaleData.diameter,
selectedTube: size,
isClicked: true,
audio: {
...scaleData.diameter.audio,
isPlayed: true
}
}
}
}
}
Il utilise toujours ES6. Voir Redux docs pour plus d'informations sur la configuration de votre code pour le même
Cependant, lorsque vous traitez avec les données imbriquées. Je préfère utiliser immutability-helpers
Pour votre code ce sera comme
import update from 'immutability-helpers';
export const selectDiameter = (scaleData,size) => {
return {
type: SELECT_DIAMETER,
payload: update(scaleData, {
diameter: {
selectedTube: { $set: size},
isClicked: { $set: true},
audio: {
isPlayed: {$set: true}
}
}
})
}
}
Ok, peut-être que je n’avais pas vraiment raison mais c’est de Dan Abramov (créateur de redux)
Enfin, vous devez vous rappeler que Object.assign est une nouvelle méthode dans ES6, il n'est donc pas disponible nativement dans tous les navigateurs. Vous devriez utilisez un polyfill, soit celui livré avec Babel, soit un autonome Object.assign polyfill, pour l'utiliser sans risque de planter votre site Internet.
Une autre option qui ne nécessite pas de remplissage multiple consiste à utiliser le nouveau fichier objet de propagation d'objet, qui ne fait pas partie de ES6. Cependant, il est proposé pour ES7. Il est assez populaire et activé dans Babel si vous utilisez le préréglage de l'étape deux.
L'alternative au code que vous avez posté utilise la propagation d'objet:
export const selectDiameter = (scaleData, size) => ({
type: SELECT_DIAMETER,
payload: {
...scaleData,
diameter: {
...scaleData.diameter,
selected_tube_diameter: size,
is_clicked: true,
audio: {
...scaleData.diameter.audio,
is_played:true
}
}
}
});
J'ai également raccourci le corps de la fonction de flèche dans votre code pour renvoyer simplement l'objet.
Vous pouvez utiliser la syntaxe de propagation objet rest en utilisant le plugin Babel transform-object-rest-spread .
Installez-le comme ceci:
npm install --save-dev babel-plugin-transform-object-rest-spread
Configurez son utilisation dans votre .babelrc comme ceci:
{
"plugins": ["transform-object-rest-spread"]
}
La propagation d'un objet est la syntaxe ES7, rendue par Babel, Object.assign () est la syntaxe ES6 et n'est pas prise en charge par certains navigateurs. C'est pourquoi vous devriez utiliser Object spread au lieu de Object.assign ()