safari中未正确触发预执行生命周期方法 当更改组件的状态然后更改url时,preact组件不会卸载 这个问题是IE和safari特有的 使用浏览器的“返回”功能时,不会触发componentDidMount,并且状态未设置为初始值

safari中未正确触发预执行生命周期方法 当更改组件的状态然后更改url时,preact组件不会卸载 这个问题是IE和safari特有的 使用浏览器的“返回”功能时,不会触发componentDidMount,并且状态未设置为初始值,safari,preact,Safari,Preact,下面是一个示例,您可以在本地运行以获得更好的理解 常数反应=预作用; 类Foo扩展了React.Component{ 状态={ 加载:错误 } componentDidMount(){ console.log('mounted'); } 离开{ 这是我的国家({ 加载:正确 }); 设置超时(()=>{ window.location.href=https://github.com/'; }, 2000); } render(){ 返回此.state.loading?loading…:离开;

下面是一个示例,您可以在本地运行以获得更好的理解


常数反应=预作用;
类Foo扩展了React.Component{
状态={
加载:错误
}
componentDidMount(){
console.log('mounted');
}
离开{
这是我的国家({
加载:正确
});
设置超时(()=>{
window.location.href=https://github.com/';
}, 2000);
}
render(){
返回此.state.loading?loading…:离开;
}
}
反应(
,
document.getElementById('app')
);

我发现这个问题与safari有关。解决上述问题的一个方法是侦听pageshow事件,然后检查加载的页面是否缓存

componentDidMount() {
  window.addEventListener('pageshow', (event) => {
    // fix for safari cached page
    if (event.persisted) {
      this.setState({
        isLoading: false
      });
    }
  });
}

编辑:页面显示事件只触发一次,这是一个已知的错误。要避免这种情况,实际上必须使用
window.location.reload()
重置所有内容。这样,下次事件将再次触发。

我会说使用
组件将卸载
并重置状态。但在页面导航上,它似乎没有触发生命周期方法。这就是问题的全部