useBeforeUnload

useBeforeUnload

此钩子只是围绕 window.beforeunload 的一个助手。

当用户点击尚未访问过的页面的链接时,Remix 会加载该页面的代码拆分模块。如果您在用户会话期间进行部署,并且您或您的主机从服务器中删除了旧文件(许多人会这样做 😭),那么 Remix 对这些模块的请求将失败。Remix 会通过在新的 URL 处自动重新加载浏览器来恢复。这应该从服务器开始,使用您的应用程序的最新版本。大多数情况下,这都能很好地解决问题,用户甚至不知道发生了什么。

在这种情况下,您可能需要将重要的应用程序状态保存到页面(例如,保存到浏览器的本地存储),因为自动页面重新加载将丢失您拥有的任何状态。

无论是否使用 Remix,这都是一个好习惯。用户可以更改 url,意外关闭浏览器窗口等。

import { useBeforeUnload } from "@remix-run/react";

function SomeForm() {
  const [state, setState] = React.useState(null);

  // save it off before the automatic page reload
  useBeforeUnload(
    React.useCallback(() => {
      localStorage.stuff = state;
    }, [state])
  );

  // read it in when they return
  React.useEffect(() => {
    if (state === null && localStorage.stuff != null) {
      setState(localStorage.stuff);
    }
  }, [state]);

  return <>{/*... */}</>;
}
Docs and examples licensed under MIT