Recibo un error de que 'exampleState' no es iterable, pero ¿por qué?
Digamos que tengo una variable de estado que contiene una matriz simple de objetos
const [exampleState, setExampleState] = useState([ { id: 1, name: 'John' }, { id: 2, name: 'Mary' } ])Quiero cambiar los valores de estos objetos condicionalmente. Pensé que un ciclo con un interior condicional sería una manera fácil de hacer esto. Intenté lo siguiente...
for (let item of exampleState) { if (item.name === 'John') { setExampleState({...exampleState, name: 'Michael'}) } }pero aparece el siguiente error: 'TypeError' exampleState no es iterable
¿Cómo debo hacer esto en su lugar?
En primer lugar, la forma habitual de hacer esto, en general, es actualizar el estado la menor cantidad de veces que sea necesario. En segundo lugar, está intentando actualizar el valor del estado con un objeto, mientras que es una lista cuando se inicializa. Esto se puede lograr usando una sola actualización:
setExampleState(...exampleState.map((user) => { if (user.name === 'John') { user.name = 'Michael'; } return user; }));puedes usar el map para eso como este
setExampleState(state => state.map(s => s.name === 'John'?{...s, name:'Michael' }: s))si establece el estado en un bucle, siempre sobrescribe su matriz con un solo elemento