useBlocker
useBlocker
钩子允许你阻止用户从当前位置导航离开,并向他们展示一个自定义的 UI,以允许他们确认导航。
function ImportantForm() {
const [value, setValue] = React.useState("");
// Block navigating elsewhere when data has been entered into the input
const blocker = useBlocker(
({ currentLocation, nextLocation }) =>
value !== "" &&
currentLocation.pathname !== nextLocation.pathname
);
return (
<Form method="post">
<label>
Enter some important data:
<input
name="data"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
</label>
<button type="submit">Save</button>
{blocker.state === "blocked" ? (
<div>
<p>Are you sure you want to leave?</p>
<button onClick={() => blocker.proceed()}>
Proceed
</button>
<button onClick={() => blocker.reset()}>
Cancel
</button>
</div>
) : null}
</Form>
);
}
有关更完整的示例,请参阅存储库中的示例。
state
阻塞器的当前状态
unblocked
- 阻塞器处于空闲状态,未阻止任何导航blocked
- 阻塞器已阻止导航proceeding
- 阻塞器正在从被阻止的导航中进行location
当处于 blocked
状态时,这表示我们阻止导航到的位置。当处于 proceeding
状态时,这是在调用 blocker.proceed()
后导航到的位置。
proceed()
当处于 blocked
状态时,你可以调用 blocker.proceed()
以继续到被阻止的位置。
reset()
当处于 blocked
状态时,你可以调用 blocker.reset()
将阻塞器返回到 unblocked
状态,并让用户停留在当前位置。