JSON.stringify для элемента react преобразует его в объект javascript

#javascript #reactjs #json

#javascript #reactjs #json

Вопрос:

У меня есть элемент react, testReactElement и я хочу отобразить его на экране, и даже после того, как пользователь закроет вкладку и снова откроет ее, они должны обнаружить, что те же данные все еще отображаются, поэтому я помещаю их в localStorage, и чтобы добавить элемент react в localStorage, я сначала должен его упорядочить, используя JSON.stringify() , и этоуспешно сохраняется localstorage , когда я хочу извлечь его из локального хранилища и отобразить, я использую JSON.parse() .

 import './App.css';
let testReactElement = <div>
    <h1>this is the title of the react element</h1>
    <p>This is the content of the react element</p>
  </div>
  localStorage.setItem('element',JSON.stringify(testReactElement))

function App() {
  return (
    <div className="App">
      {JSON.parse(localStorage.getItem('element'))}
    </div>
  );
}
export default App;
 

Проблема в том, что JSON.parse() возвращает объект javascript, который выглядит похоже, но не совпадает с элементом react, который я изначально добавил в localStorage, и во вновь возвращенном объекте отсутствуют некоторые ключи, поэтому react не распознает его как элемент react и выдает следующую ошибку Error: Objects are not valid as a React child (found: object with keys {type, key, ref, props, _owner, _store}). If you meant to render a collection of children, use an array instead.
Когда я попытался сравнить исходный элемент react со строковым, я обнаружил, что после строковой обработки в элементе react отсутствует символьный ключ ‘$$typeof’, и это то, что заставляет react не распознавать его как элемент react и видеть его только как обычный объект JS, поэтому возникает ошибкаошибка. После некоторого поиска в Google я обнаружил, что это происходит потому, что когда мы пытаемся использовать JSON.stringify(символ), он возвращается undefined .
Итак, как я могу вставить элемент react, localstorage а затем вернуть его обратно в том виде, в котором я его изначально ввел, чтобы я мог отобразить его на экране?

Комментарии:

1. JSON.stringify не сохраняет определенные значения (функции, неопределенные), так что это не сработает. Вам лучше сохранить копию состояния компонента, а затем соответствующим образом восстановить компонент.

Ответ №1:

Вы должны использовать useEffect при попытке получить элементы из локального хранилища, а не делать это в jsx.
Живая демонстрация

 import { useEffect, useState } from "react";
import "./styles.css";

let testReactElement = "this is the title of the react element";

function App() {
  const [data, setData] = useState(testReactElement);

  useEffect(() => {
    const data = localStorage.getItem("data");
    if (data) {
      setData(JSON.parse(data));
    }
  }, []);

  useEffect(() => {
    localStorage.setItem("data", JSON.stringify(data));
  });

  return <div>{data}</div>;
}
export default App;