es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Flujo de trabajo del operador de propagación en ReactJS.

React sugiere no mutar el estado. Tengo un array de objetos que estoy manipulando según algunos eventos. Mi pregunta es, ¿está bien escribirlo de esta manera?:

“`*.js
const makeCopy = (arr) => arr.map((item) => ({ …item }));

function SomeComponenet() {
const [filters, setFilters] = useState(aemFilterData);

const handleFilterClick = (filter, c) => {
let copiedFilters = makeCopy(filters);

<pre><code>/**
* Aplicar el cambio también en el padre
*/
if (!("parentId" in filter)) {
copiedFilters[filter.id].open = !copiedFilters[filter.id].open;
}
setFilters(copiedFilters);
</code></pre>

}

}

<pre><code><br />¿Estoy mutando el objeto original al hacerlo de la manera anterior? ¿O hace alguna diferencia si se escribe de esta manera?:

“`*.js
const makeCopy = (arr) => arr.map((item) => ({ …item }));

function SomeComponent() {
const [filters, setFilters] = useState(aemFilterData);

const handleFilterClick = (filter, c) => {
let copiedFilters = makeCopy(filters);

/**
* Aplicar el cambio también en el padre
*/
if (!(“parentId” in filter)) {
copiedFilters = copiedFilters.map((f) => {
if (filter.id === f.id) {
return {
…f,
open: !f.open,
};
} else {
return { …f };
}
});
}
setFilters(copiedFilters);
}

}

¿Cuál es la forma preferida de hacer esto? Los operadores spread se vuelven bastante verbosos y no me gusta, pero prefiero utilizarlos si es la forma en que debo hacerlo aquí. immutable.js y immer no son una opción en este momento.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según las mejores prácticas de React, no se recomienda modificar el estado directamente. En el primer bloque de código, se utiliza la función makeCopy() para crear una copia del array filters y luego manipularlo. Esto evita modificar directamente el objeto original y asegura la inmutabilidad.

    Sin embargo, el código aún tiene un problema potencial de cambios mutables con la propiedad open que se modifica directamente. Como enfoque mejorado, el segundo bloque de código demuestra la creación de un nuevo array de filtros utilizando la función map() y devuelve un nuevo objeto con el valor actualizado de la propiedad open. Este enfoque asegura que no se esté produciendo mutación y es una forma preferida de manejar cambios en el estado.

    Es comprensible que el uso de operadores de propagación pueda volverse verboso, pero sigue siendo la forma recomendada y preferida de lograr inmutabilidad en JavaScript y React. Como se mencionó, bibliotecas como Immutable.js e Immer también pueden proporcionar una forma simplificada de manejar la inmutabilidad, pero al no ser una opción en este caso, se recomienda utilizar operadores de propagación u enfoques similares.

Comments are closed.