【发布时间】:2021-06-25 15:19:33
【问题描述】:
我想强制重新加载页面(即使在使用后退按钮导航时),因为在 Safari 浏览器中,Safari 会加载页面的缓存版本,这不是我们想要的。
使用 React Hooks,我可以在 useEffect 中做到这一点。
function MyComponent() {
useEffect(() => {
if (typeof window != 'undefined') {
window.onpageshow = event => {
if (event.persisted) {
window.location.reload()
}
}
}
}, [])
return (<div>My Page Content</div>)
}
我的问题是:这样做时,是否会重复调用重新加载,因为重新加载会触发组件的重新渲染和重新安装,这反过来会调用 useEffect,然后调用 reload 然后进入这个无限循环?
另一种方法是模仿 React 类 constructor:
function MyComponent() {
const [reloadHasRun, setReloadHasRun] = useState(false)
const forceReload = () => {
if (typeof window !== 'undefined') {
window.onpageshow = event => {
if (event.persisted) {
window.location.reload()
}
}
}
setReloadHasRun(true)
}
if (!reloadHasRun)
forceReload()
return (<div>My Page Content</div>)
}
但是,我也有同样的问题。强制重新加载是否让我陷入组件不断重新渲染、重新安装以及一遍又一遍调用重新加载的情况?
最终,我希望在 Safari 上单击后退按钮时重新加载前一页,而不仅仅是从缓存中提取。
【问题讨论】: