useBeforeUnload
このフックは、window.beforeunload
のラッパーです。
ユーザーがまだ訪問していないページへのリンクをクリックすると、Remix はそのページのコード分割モジュールをロードします。ユーザーセッションの途中にデプロイし、ホストまたは自分自身でサーバーから古いファイルを削除した場合(多くの人がそうします 😭)、Remix のこれらのモジュールに対するリクエストは失敗します。Remix は、新しい URL でブラウザを自動的にリロードすることで回復します。これにより、アプリケーションの最新バージョンでサーバーからやり直します。ほとんどの場合、これはうまく機能し、ユーザーは何も起こらなかったことに気付かずに済みます。
このような状況では、自動ページリロードによって失われる可能性のあるページ上の重要なアプリケーション状態を(ブラウザのローカルストレージなど)に保存する必要がある場合があります。
Remix であってもなくても、これは良い習慣です。ユーザーは URL を変更したり、誤ってブラウザウィンドウを閉じたりすることもできます。
import { useBeforeUnload } from "@remix-run/react";
function SomeForm() {
const [state, setState] = React.useState(null);
// 自動ページリロード前に保存します
useBeforeUnload(
React.useCallback(() => {
localStorage.stuff = state;
}, [state])
);
// 彼らが戻ってきたときに読み込みます
React.useEffect(() => {
if (state === null && localStorage.stuff != null) {
setState(localStorage.stuff);
}
}, [state]);
return <>{/*... */}</>;
}