Получение ошибки при обновлении страницы при попытке сохранить состояние после обновления страницы

#javascript #reactjs #react-router #react-hooks #local-storage

Вопрос:

Я пытаюсь сохранить состояние после обновления страницы в React:

Вот мой код:

 class App extends React.Component{
    constructor(props){
        super(props);
        this.state = JSON.parse(localStorage.getItem("app_state")) ? JSON.parse(localStorage.getItem("app_state")) : {
            account: {
                email: "",
                password: ""
            },
            token: "",
            authenticated: false
        };

    }


    componentDidUpdate(prevProps, prevState){
        if(this.state.token !== prevState.token){ //set a new state if token changes
            localStorage.setItem("app_state", this.state);
        }
    }
    
    
    
    
    logInStatus = () =>{

        if(!this.state.authenticated) {
            return (
                <form onSubmit={this.handleSubmit}>
                    
                    <label>Email Address</label>
                    <input type="text" value={this.state.passAccount.email} onChange={this.handleChange} name="email"/>                
                
                    <label>Password</label>
                    <input type="password" value={this.state.passAccount.password} onChange={this.handleChange} name="password" />
     
                    
                    <br/>                    
                    <Button type="submit" onClick={() => {
                        this.someFunction(String(this.state.passAccount.email));
                    }}>
                        Sign In</Button>
                </Form>
            );
        }else{
            return(<Redirect to="/some/endpoint" />);
        }
    }
    
    
    
}

export default App;
 

Вот что я делаю, чтобы предотвратить потерю состояния при обновлении страницы:

В методе componentDidUpdate я проверяю наличие токена, если он не найден/не совпадает с токеном состояния, я сохраняю его в локальном хранилище.

В состоянии в конструкторе я получаю состояние из localstorage.

Однако при обновлении страницы я получаю следующую ошибку:

Ошибка, которую я получаю

Вот скриншот локального хранилища: снимок локального хранилища

Что не так с моим кодом, что нужно исправить ?

Ответ №1:

Вам не нужно, чтобы JSON.parse ваш объект localStorage был таким

Поэтому измените на:

 class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = localStorage.getItem("app_state") ?? {
      account: {
        email: "",
        password: ""
      },
      token: "",
      auth: false
    };
  }

  componentDidUpdate(prevProps, prevState) {
    if (this.state.token !== prevState.token) { // Set a new state if token change
      localStorage.setItem("app_state", this.state);
    }
  }
...the rest of your component
 

Не забудьте очистить текущее хранилище, прежде чем пробовать новый код