Задать вопрос
@webjun

Почему при перезагрузке страницы мои данные пропадают?

Делаю тудулист и хочу, чтобы при перезагрузке страницы туду пользователя сохранялись, но почему-то данные пропадают, хотя в локальной памяти сохраняются, в чем может быть проблема?

const [value, setValue] = React.useState<string>("");
  const [todos, setTodos] = React.useState<Itodo[]>([]);
  const inputRef = React.useRef<HTMLInputElement>(null);

const addTodo = () => {
    setTodos([
      ...todos,
      {
        id: Date.now(),
        complete: false,
        title: value,
      },
    ]);
    localStorage.setItem("todos", JSON.stringify(todos));
    localStorage.getItem("todos");
    setValue("");
  };
  • Вопрос задан
  • 1168 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
0xD34F
@0xD34F Куратор тега React
Встречный вопрос: почему вы решили, что должно быть иначе? Код, который бы доставал данные из localStorage и клал их в todos, где он, почему его нет? Должен быть, например:

const [ todos, setTodos ] = useState(() => {
  let todos = null;

  try {
    todos = JSON.parse(localStorage.getItem('todos'));
  } catch (e) {};

  return Array.isArray(todos) ? todos : [];
});

Уверен, здесь вы ждёте, что добавляемый объект окажется в localStorage:

setTodos([
  ...todos,
  {
    id: Date.now(),
    complete: false,
    title: value,
  },
]);
localStorage.setItem("todos", JSON.stringify(todos));

Этого происходить не будет (ну, пока ещё что-то не добавите, и это "ещё что-то" тоже попадёт в localStorage не сразу). Вы не понимаете, что происходит при вызове setTodos. Откройте документацию и разберитесь. Сохранение в localStorage следует делать через useEffect:

useEffect(() => {
  localStorage.setItem('todos', JSON.stringify(todos));
}, [ todos ]);
Ответ написан
@webjun Автор вопроса
Основная загвоздка была в строгом режиме, после того как я его убрал все работало как должно, решение вопроса:
React.useEffect(() => {
    if (inputRef.current) {
      inputRef.current.focus();
    }
    const data = localStorage.getItem("todos");
    if (typeof data === "string") {
      setTodos(JSON.parse(data));
    }
  }, []);

  React.useEffect(() => {
    localStorage.setItem("todos", JSON.stringify(todos));
  }, [todos]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы