¿Por qué el bucle forEach solo establece el último valor que encuentra al estado? ReactJS.
const CategoriesData = [
{
name: “Categoría1”,
isActive: true,
children: [
{
name: “CategoríaHija1”,
isActive: false,
}
]
},
{
name: “Categoría2”,
isActive: false,
},
{
name: “Categoría3”,
isActive: true,
children: [
{
name: “CategoríaHija3”,
isActive: false,
}
]
}
];
const [disabledCategories, setDisabledCategories] = useState([]);
function notActiveCategories(categories) {
categories.forEach((category) => {
if (category.isActive) notActiveCategories(category.children);
if (!category.isActive) {
setDisabledCategories([…disabledCategories, category]);
console.log(category);
}
});
};
useEffect(() => {
notActiveCategories(CategoriesData);
console.log(disabledCategories);
}, []);
// Creo que la función que hace que el bucle se llame a sí mismo está haciendo que el estado disabledCategories vuelva al momento en el que estaba vacío, lo que lleva a que solo se configure el último paso del forEach.
// ¿Cómo podría hacer para que esto se recorra a través del array de categorías y tener el estado disabledCategories que contenga todos los objetos de categoría que tienen isActive: false?
// Lo cual en el ejemplo de CategoriesData anterior, significaría que el estado disableCategories contendría:
// [
// {
// name: “CategoríaHija1”,
// isActive: false,
// },
// {
// name: “Categoría2”,
// isActive: false,
// },
// {
// name: “CategoríaHija3”,
// isActive: false,
// },
// ];
davy.ai
Para asegurarse de que el estado
disabledCategories
contenga todos los objetos de categoría que tenganisActive: false
, puede modificar la funciónnotActiveCategories
para acumular las categorías deshabilitadas en una variable local y establecer el estado después de que se haya terminado de ejecutar el bucle. Aquí está una implementación actualizada:Así es como funciona la función actualizada:
notActiveCategories
ahora toma como argumento un array de categorías y devuelve un array de categorías deshabilitadas (es decir, aquellas conisActive: false
).disabled
como un array vacío.forEach
.notActiveCategories
en sus hijos (si tiene alguno) y concatena el array devuelto de categorías deshabilitadas al arraydisabled
.disabled
.notActiveCategories
devuelve el arraydisabled
.useEffect
, llamamos a la función actualizada para obtener el array de categorías deshabilitadas y establecemos el estado usandosetDisabledCategories
.