Cómo utilizar React Toggle dentro de la función Map
Estoy intentando usar un interruptor dentro de una función de mapa. Pensé que lo tenía, pero claramente hay algo mal en mi lógica. Cuando hago clic en algunos de los elementos de interruptor dentro del mapa, tengo que hacer clic en ellos dos veces para ver el cambio. Parece que sucede cuando activo un artículo como verdadero y luego activo inmediatamente otro artículo como verdadero. Gracias de antemano por cualquier ayuda.
Aquí está el CodeSandbox: https://codesandbox.io/s/nice-hertz-srgew
Y el código:
import React, { useState, useEffect } from "react";
import axios from "axios";
import "./styles.css";
export default function App() {
const [people, setPeople] = useState([]);
const [prodToggle, setProdToggle] = useState(false);
const [partToggle, setPartToggle] = useState(false);
useEffect(() => {
axios.get("./data.json").then((res) => {
setPeople(res.data.people);
});
}, []);
const onAddProdSelect = () => {
const updatedProdToggle = !prodToggle;
setProdToggle(updatedProdToggle);
};
const onAddPartSelect = (i) => {
const updatedToggle = !partToggle;
setPartToggle(updatedToggle);
const updatedData = people.map((item, idx) => {
if (idx === i) {
return {
...item,
itemPartToggle: updatedToggle
};
}
return item;
});
setPeople(updatedData);
};
return (
<main>
<div onclick="{()" ==""> onAddProdSelect()}>
<p>{prodToggle ? "Red" : "Blue"}</p>
</div>
{people.map((person, i) => (
<div onclick="{()" ==""> onAddPartSelect(i)} key={i}>
<p>{person.itemPartToggle ? person.name : person.age}</p>
</div>
))}
</main>
);
}
davy.ai
El problema con el alternador dentro de la función de mapa es que está utilizando el mismo estado para todos los elementos del array. Cuando se activa el alternador en un elemento, actualiza el estado para todos los elementos del array. Para solucionar este problema, es necesario almacenar el estado del alternador para cada elemento individualmente.
Una forma de hacerlo es agregar una nueva propiedad a cada elemento del array
people
para almacenar su estado de alternador. Por ejemplo, puede agregar una propiedaditemPartToggle
con un valor inicial defalse
.Luego, en la función
onAddPartSelect
, puede actualizar la propiedaditemPartToggle
del elemento seleccionado solamente, en lugar de actualizar el estado para todos los elementos en el array.Aquí está el código actualizado con estos cambios:
Ahora cada elemento en el array tiene su propio estado de alternador, y se puede alternar cada elemento de forma independiente sin afectar a los otros.