Таким образом, предупреждение заключается в том, что setState
вызывается <Cart />
даже после того, как вы вернетесь в приложение, что означает, что компонент корзины будет отключен к тому времени.
Вы должны следить за тем, когда Cart
отключается.
Это можно сделать, создав переменную в своем компоненте Cart
, например _isMounted
, а затем используя событие жизненного цикла componentWillUnmount
, чтобы отслеживать.
componentWillUnmount(){
_isMounted =false
}
Затем, перед тем, как использовать setState, выполните быструю проверку, чтобы убедиться, что _isMounted
истинно.
this.callApi()
.then(res => if(isMounted){
this.setState({ cartData: res.express}))
}
.catch(err => console.log(err));
Очевидно, вам также нужно изменить _isMounted
на true, используяComponentDidMount
Вот статья на эту тему
Что касается состояния приложения, которое не «обновляется» ... это потому, что компонент приложения никогда неразмонтирует и монтирует снова, когда вы идете из App> Cart> App.
Чтобы исправить это, скажите switch
, чтобы монтировать компонент <App />
только тогда, когда url-адрес точно соответствует домашней странице, используя exact path="/"
<switch>
<div>
<Route exact path="/displayCart" component={Cart}/>
<Route exact path="/" component={App} />
</div>
</switch>
Теперь, если вы хотите отслеживать изменения состояния, даже если оно закрыто (размонтировано) до завершения вызова API, вы должны создать внутри <App/>
функцию, которая выполняет setState
для вас и передайте его в качестве реквизита <Cart />
, а затем изнутри Вы можете вызвать эту функцию реквизита.
Это будет работать, только если вы поместите свой React Router внутри
Я делаю это так: - index.js всегда загружается - Внутри я тогдаперенаправить на шоу правильный компонент
Это означает, что всегда монтируется.Тем не менее, он позволяет мне использовать состояние приложения как «основное» состояние по умолчанию, которое всегда существует, поскольку я никогда не отключаю его.Поэтому, если у меня есть дочерний компонент, такой как ..., я могу дать Cart одну из функций.Эта функция изменит состояние внутри независимо от того, установлен ли он / отображается.
Если вы реструктурируете свое приложение таким образом, вы можете сделать следующее:
App.js Добавьте функцию, которая изменит свое состояние.
changeState(key, value){
this.setState({
key : value
}
}
Теперь передайте эту функцию как опору
<BrowserRouter>
<switch>
<div>
<Route exact
path="/displayCart"
render={
(props) => <Cart {...props}
changeStateinApp={this.changeState} />
}
/>
<Route component={App} />
</div>
</switch>
</BrowserRouter>,
Cart.js Теперь вызовите эту функцию
this.callApi()
.then(res =>
this.props.changeStateinApp(cartData, res.express)
.catch(err => console.log(err));