javascript - ¿Usar Object.assign u Spread Operator en React/Redux? Cual es una mejor practica
reactjs (4)
La alternativa al código que publicó es usar la distribución de objetos:
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
}
}
}
});
También he acortado el cuerpo de la función de flecha en su código para simplemente devolver el objeto.
Puede usar la sintaxis del objeto rest spread utilizando el complemento Babel transform-object-rest-spread .
Instálalo así:
npm install --save-dev babel-plugin-transform-object-rest-spread
Configure su uso en su .babelrc de esta manera:
{
"plugins": ["transform-object-rest-spread"]
}
Tengo cierta confusión sobre el uso de
Object.assign
para React y Redux.
He leido este article .
Dice que ES6 no es compatible con todos los navegadores, pero he comenzado a usarlo.
Tengo dos preguntas:
-
¿Es la decisión correcta continuar con
Object.assign
? - Cual es la alternativa?
Mi código
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
})
})
})
}
}
¿Cuál es la alternativa para el código anterior?
La propagación de objetos es la sintaxis ES7, renderizado es compatible con Babel, Object.assign () es la sintaxis ES6, no es compatible con algunos navegadores. Es por eso que debes usar Object spread en lugar de Object.assign ()
Ok, puede que no tuviera razón, pero esto es de Dan Abramov (creador de redux)
Finalmente, debe recordar que Object.assign es un nuevo método en ES6, por lo que no está disponible de forma nativa en todos los navegadores. Debe usar un polyfill, ya sea el que se envía con Babel o un Object.assign polyfill independiente, para usarlo sin correr el riesgo de bloquear su sitio web.
Otra opción que no requiere un polyfill es usar el nuevo operador de propagación de objetos, que no forma parte de ES6. Sin embargo, se propone para ES7. Es bastante popular y está habilitado en Babel si usa el preajuste de la etapa dos.
Redux docs recomienda que utilice el enfoque de operador de propagación en lugar de
Object.assign
Según los documentos:
Un enfoque alternativo es usar la sintaxis de propagación de objetos propuesta para las próximas versiones de JavaScript que le permite usar el operador de propagación (...) para copiar propiedades enumerables de un objeto a otro de una manera más sucinta. El operador de propagación de objetos es conceptualmente similar al operador de propagación de matriz ES6
La ventaja de usar la sintaxis de propagación de objetos se hace más evidente cuando compones objetos complejos
Usando la sintaxis del operador 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
}
}
}
}
}
Todavía usa ES6. Consulte los redux.js.org/docs/recipes/UsingObjectSpreadOperator.html para obtener más información sobre cómo configurar su código para el mismo
Sin embargo, cuando se trata de datos anidados.
Prefiero usar
immutability-helpers
Para su código será como
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}
}
}
})
}
}