Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

201
Visualizações
LocalStorage no establece elementos en sí mismo

Tengo un error con LocalStorage en react.js. Trato de configurar un todo en él, pero no se carga. Este es el código:

 import React, { useState, useRef, useEffect } from 'react'; import './App.css'; import TodoList from './TodoList'; const { v4: uuidv4 } = require('uuid'); const LOCAL_STORAGE_KEY = 'todoApp.todos' function App() { const [todos, setTodos] = useState([]); const TodoNameRef = useRef() useEffect(() => { const storedTodos = JSON.parse(localStorage.getItem(LOCAL_STORAGE_KEY)) if (storedTodos) setTodos(storedTodos) }, []) useEffect(() => { localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(todos)) }, [todos]) function HandleAddTodo(e){ const name = TodoNameRef.current.value if (name==='') return setTodos(prevTodos => { return[...prevTodos, { id:uuidv4(), name:name, complete:false}] }) TodoNameRef.current.value = null } return ( <> <TodoList todos={todos}/> <input ref={TodoNameRef} type="text" /> <button onClick={HandleAddTodo}>Add todo</button> <button>clear todo</button> <p>0 left todo</p> </> ) } export default App;
Esto es TodoList.js

 import React from 'react' import Todo from './Todo'; export default function TodoList({ todos }) { return ( todos.map(todo =>{ return <Todo key ={todo.id} todo={todo} /> }) ) }
Y como último Todo.js:

 import React from 'react' export default function Todo({ todo }) { return ( <div> <label> <input type="checkbox" checked={todo.complete}/> {todo.name} </label> </div> ) }

Lo que tiene que hacer el código es cargar una tarea pendiente en el almacenamiento local y, después de actualizar la página, volver a cargarla en el documento. El código que implementé lo comencé con reaccionar, pero espero que alguien pueda pasarme el código correcto para que funcione. Si alguien necesita una explicación extra, que me lo diga.

Saludos cordiales, anonimo

about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

Agregó los métodos getItem y setItem de localStorage en dos ganchos useEffect. El siguiente código inicializa el valor de todo en localStorage al recargar la página.

 useEffect(() => { localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(todos)) }, [todos])

Por lo tanto, debe establecer el valor de todo en el evento HandleAddTodo.

Edité tu código y espero que te ayude.

 import React, { useState, useRef, useEffect } from 'react'; import './App.css'; import TodoList from './TodoList'; const { v4: uuidv4 } = require('uuid'); const LOCAL_STORAGE_KEY = 'todoApp.todos' function App() { const [todos, setTodos] = useState([]); const TodoNameRef = useRef() useEffect(() => { const storageItem = localStorage.getItem(LOCAL_STORAGE_KEY); const storedTodos = storageItem ? JSON.parse(storageItem) : []; if (storedTodos) setTodos(storedTodos) }, []); function HandleAddTodo(e){ const name = TodoNameRef.current.value; if (name==='') return; const nextTodos = [...todos, { id:uuidv4(), name:name, complete:false}]; setTodos(nextTodos); localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(todos)); TodoNameRef.current.value = null } return ( <> <TodoList todos={todos}/> <input ref={TodoNameRef} type="text" /> <button onClick={HandleAddTodo}>Add todo</button> <button>clear todo</button> <p>0 left todo</p> </> ) } export default App;
about 4 years ago · Juan Pablo Isaza Relatório

0

Intente desacoplar su lógica de almacenamiento local en su propio gancho de reacción. De esa manera, puede manejar obtener y configurar el estado y actualizar el almacenamiento local en el camino y, lo que es más importante, reutilizarlo en múltiples componentes.

El siguiente ejemplo es una forma de implementar esto con un gancho personalizado.

 const useLocalStorage = (storageKey, defaultValue = null) => { const [storage, setStorage] = useState(() => { const storedData = localStorage.getItem(storageKey); if (storedData === null) { return defaultValue; } try { const parsedStoredData = JSON.parse(storedData); return parsedStoredData; } catch(error) { console.error(error); return defaultValue; } }); useEffect(() => { localStorage.setItem(storageKey, JSON.stringify(storage)); }, [storage]); return [storage, setStorage]; }; export default useLocalStorage;

Y lo usará de la misma manera que usaría un useState . (Debajo de la superficie, en realidad no es más que un estado con algunos efectos secundarios).

 const LOCAL_STORAGE_KEY = 'todoApp.todos' function App() { const [todos, setTodos] = useLocalStorage(LOCAL_STORAGE_KEY, []); const handleAddTodo = event => { setTodos(prevTodos => { return[...prevTodos, { id: uuidv4(), name, complete: false }] }) }; return ( <button onClick={HandleAddTodo}>Add todo</button> ); }
about 4 years ago · Juan Pablo Isaza Relatório

0

No hay necesidad de agregar el segundo useEffect . Puede configurar su local Storage mientras realiza el envío en la función handleTodo . Cosas que necesita agregar o eliminar:

  1. Elimina el segundo useEffect .

  2. Modifique su función handleTodo:

     const nextTodos = [...todos, { id:uuidv4(), name:name,complete:false}]; setTodos(nextTodos); localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(nextTodos));

Nota: asegúrese de no pasar todos en lugar de nextTodos , ya que sabemos que setTodos es una función asíncrona. Es posible que estemos configurando una copia anterior de todos .

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda