Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

114
Vistas
¿Por qué useEffect no establece elementos del almacenamiento local?

Empecé a aprender desarrollo web recientemente y esto me está haciendo doler la cabeza. Creé una aplicación de tareas sencillas en la que puedes agregar un elemento con id y valor a una matriz y eliminar el elemento de la matriz. Ahora quiero que cada vez que se actualice el sitio, quiero que los elementos estén allí. Hice una matriz de prueba y, por alguna razón, cuando se actualiza, funciona pero no con data .

 const [items, setItems] = useState([]); const testarr = [{id: 1, value: "a"}, {id: 2, value: "b"}]; useEffect(() => { const data = JSON.parse(localStorage.getItem("items")); console.log(data); // setItems(testarr); setItems(data); }, []) useEffect(() => { window.localStorage.setItem("items", JSON.stringify(items)); }, [items]);

Lo que se me ocurrió:

 useEffect(() => { const data = JSON.parse(localStorage.getItem("items")); data.forEach(element => { setItems(oldarr => [...oldarr, element]); }); }, [])

El problema es que, si sigo actualizando el sitio lo suficientemente rápido, eventualmente la matriz volverá a estar vacía. No entiendo, cuando se actualiza, registra data bien, pero cuando quiero setItems(data) que no funcionan. ¿Alguien sabe por qué se comporta así?

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

setState es una función asíncrona, esto implica que este fragmento de código a continuación siempre se ejecutará con elementos como matrices vacías antes de que los elementos reciban datos de "setItems (datos)".

 useEffect(() => { window.localStorage.setItem("items", JSON.stringify(items)); }, [items]);

tal vez, puede verificar si los elementos no son una matriz vacía antes de almacenar

 useEffect(() => { if (Array.isArray(items) && items.length > 0) { window.localStorage.setItem("items", JSON.stringify(items)); } }, [items]);
about 4 years ago · Juan Pablo Isaza Denunciar

0

Intente localStorage sin objeto de ventana

Por ejemplo:

 useEffect(() => { localStorage.setItem("items", JSON.stringify(items)); }, [items]);
about 4 years ago · Juan Pablo Isaza Denunciar

0

Tema

El siguiente useEffect se ejecuta cada vez que los items cambian, pero también en el montaje. Y en los items de montaje es igual a [] , esa matriz dada a useState al principio. Es por eso que localStorage se establece en [] .

 useEffect(() => { window.localStorage.setItem("items", JSON.stringify(items)); }, [items]);

Solución

Una forma de resolver este problema es cambiar la definición de su estado como se muestra a continuación, de modo que cuando haya datos en el localStorage , los elija:

 const [items, setItems] = useState(!localStorage.getItem("items") ? [] : JSON.parse(localStorage.getItem("items")));

Y en este punto, puede eliminar esos dos useEffect s que tiene allí para obtener datos de localStorage y dárselos a setItems .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda