альтернатива для этого случая установки компонента?

#reactjs #react-lifecycle

#reactjs #реагировать-жизненный цикл

Вопрос:

Я пытаюсь провести рефакторинг некоторого старого кода.

componentWillMount устарел.

Как бы я реорганизовал его здесь во что-то другое?

 class Detail extends React.Component{

constructor(props) {
    super(props);

    this.state = {
        logged_out_redirect: true
    };
}   

componentWillMount() {  //<------ this lifecycle method has been deprecated, how do I replace it?

    if (localStorage.getItem("JWT")) {
        this.setState({logged_out_redirect: false});
    }
}

render() {

    if (this.state.logged_out_redirect) {
        return (<Redirect to={"/login"}/>)
    }

    return (        )

}

}
  

Ответ №1:

В этом случае (зависит от case, что вы пытаетесь сделать в componentWillMount ). Вы не можете поместить его в свой constructor()

 constructor(props) {
  super(props);

  this.state = {
    logged_out_redirect: localStorage.getItem("JWT") ? false : true
  };
}
  

Ответ №2:

Вы можете попробовать использовать getDerivedStateFromProps . Это будет вызвано в первый раз и для любого последующего обновления.

 static getDerivedStateFromProps(props, state) {
    if (localStorage.getItem("JWT") amp;amp; state.logged_out_redirect) {
        return {logged_out_redirect: false};
    }
    return null;
}
  

Ответ №3:

Вы можете заменить его на componenDidMount :

 componentDidMount() {   
    if (localStorage.getItem("JWT")) {
        this.setState({logged_out_redirect: false});
    }
}
  

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

1. Спасибо за предложение помочь. Я уже пробовал это. Вот почему это не работает. Метод визуализации содержит if (this.state.logged_out_redirect) { return (<Redirect to={"/login"}/>) } . К моменту монтирования он уже перенаправлен на другой компонент. Так componentDidMount либо не срабатывает, либо срабатывает слишком поздно.