Manejo de múltiples casillas de verificación en React
[ACTUALIZACIÓN] Agregar Codesand: https://codesandbox.io/s/withered-cherry-lf9po?file=/src/component/Assign.jsx
En mi proyecto de clase, quiero tener una interfaz de checkbox como esta:
Cuando hago clic en el checkbox superior (checkbox Asignar), se marcan todos los checkboxes de abajo. De lo contrario, si desmarco el checkbox superior, se desmarcan todos los de abajo.
Mi enfoque es crear un arreglo de estados de checkbox marcados:
const [isChecked, setIsChecked] = useState(
new Array(4).fill(false)
);
A continuación, manejaré el evento onChange
del checkbox superior. Actualizaré todos los elementos de isChecked
para que tengan el mismo estado que el checkbox superior.
const assign = () => {
return (
<formcontrollabel control=""></formcontrollabel><checkbox onchange="{(event)" ==""> {
for(var i = 0; i < 4; i++)
isChecked[i] = event.currentTarget.checked
setIsChecked(isChecked)
}
}/>}
label={<span style="{{" fontsize:="" '0.89rem'="" }}="">
Asignar</span>} />
)
}
Los estados de los checkboxes de abajo se actualizan según el arreglo isChecked[]
.
const miniAssign = (index) => {
return (
<checkbox {...label}="" checked="{isChecked[index]}/">
)
}
Esto lleva a un problema. Cuando hago clic en el checkbox superior, ninguno de los de abajo se marca. Por favor, dime qué hay de mal aquí y cómo puedo solucionarlo.
davy.ai
El problema está en la naturaleza inmutable de los arrays en JavaScript. Cuando actualizas un elemento en el array, en realidad no estás creando un nuevo array con los valores actualizados. En cambio, estás mutando el array original. En el evento
onChange
del checkbox superior, estás actualizando el arrayisChecked
pero no estás creando un nuevo array con los valores actualizados. Por lo tanto, cuando llamas asetIsChecked
, React no detecta ningún cambio en el arrayisChecked
y no vuelve a renderizar el componente.Para solucionar esto, necesitas crear un nuevo array con los valores actualizados en lugar de mutar el array original. Puedes usar la función
map
para crear un nuevo array con los valores actualizados para cada elemento.Así es como puedes actualizar el evento
onChange
del checkbox superior:En el código anterior, estamos creando una nueva función
handleAssignChange
que crea un nuevo array con los valores actualizados usando la funciónmap
. Luego, estamos pasando esta función al eventoonChange
del checkbox superior.Al crear un nuevo array con los valores actualizados, React detectará los cambios y volverá a renderizar el componente con los estados de los checkboxes actualizados.
También puedes ver el código actualizado con un ejemplo funcional en CodeSandbox aquí: https://codesandbox.io/s/withered-cherry-lf9po?file=/src/component/Assign.jsx