Реагируют на 16 триггеров componentDidMount()
при возврате в Safari, даже если компонент никогда не отключался.Как реагирует знать, когда монтировать?
class Foo extends React.Component {
state = {
loading: false
}
componentDidMount() {
// when going back in safari
// triggers in react 16, but not in 15.3 or preact
console.log('mounted');
}
componentWillUnmount() {
// will never trigger
console.log('will unmount');
}
leave() {
this.setState({
loading: true
});
setTimeout(() => {
window.location.href = 'https://github.com/';
}, 2000);
}
render() {
return this.state.loading ? <div>loading...</div> : <button onClick={this.leave.bind(this)}>leave</button>;
}
}
Фон
Safari использует bfcache.Если вы вернетесь назад, последняя страница будет извлечена из кэша.
При использовании реакции 15.3 или таких библиотек, как preact, выход из страницы не вызовет componentWillUnmount
, а возврат назад не вызовет componentDidMount
.
Такое поведение вызывает несколько проблем - например, когда вы устанавливаете состояние страницы на loading
перед перенаправлением.Если пользователь возвращается, состояние по-прежнему установлено на загрузку, и вы даже не можете сбросить состояние с помощью componentDidMount
, потому что оно никогда не срабатывает.
Существует решение с помощью onpageshow
, но так как срабатывает только один раз , вам необходимо перезагрузить всю страницу, используя window.location.reload()
. Это также причина, по которой реакция не может полагаться на это решение.