useBlocker
useBlocker フックを使用すると、ユーザーが現在の場所から移動するのを防ぎ、ナビゲーションを確定するためのカスタム UI を表示できます。
function ImportantForm() {
const [value, setValue] = React.useState("");
// 入力にデータが入力された場合、他の場所に移動するのをブロックします
const blocker = useBlocker(
({ currentLocation, nextLocation }) =>
value !== "" &&
currentLocation.pathname !== nextLocation.pathname
);
return (
<Form method="post">
<label>
重要なデータを入力してください:
<input
name="data"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
</label>
<button type="submit">保存</button>
{blocker.state === "blocked" ? (
<div>
<p>本当に移動しますか?</p>
<button onClick={() => blocker.proceed()}>
続行
</button>
<button onClick={() => blocker.reset()}>
キャンセル
</button>
</div>
) : null}
</Form>
);
}より完全な例については、リポジトリの 例 を参照してください。
プロパティ
state
ブロッカーの現在の状態
unblocked- ブロッカーはアイドル状態で、ナビゲーションを妨げていませんblocked- ブロッカーがナビゲーションを妨げましたproceeding- ブロッカーはブロックされたナビゲーションから進行中です
location
blocked 状態の場合、これはナビゲーションをブロックした場所を表します。proceeding 状態の場合、これは blocker.proceed() 呼び出し後にナビゲートされる場所です。
メソッド
proceed()
blocked 状態の場合、blocker.proceed() を呼び出して、ブロックされた場所に移動できます。
reset()
blocked 状態の場合、blocker.reset() を呼び出して、ブロッカーを unblocked 状態に戻し、ユーザーを現在の場所に残すことができます。