React Router v7 已发布。 查看文档
useBlocker
本页内容

useBlocker

useBlocker 钩子允许你阻止用户从当前位置导航离开,并向他们展示一个自定义的 UI,以允许他们确认导航。

这仅适用于 React Router 应用程序内的客户端导航,不会阻止文档请求。要阻止文档导航,你需要添加自己的 `beforeunload` 事件处理程序。 阻止用户导航有点违反模式,因此请仔细考虑此钩子的任何用法并谨慎使用。在阻止用户从半填写的表单导航离开的实际用例中,你可以考虑将未保存的状态持久化到 `sessionStorage`,并在他们返回时自动重新填充它,而不是阻止他们导航离开。
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 状态,并让用户停留在当前位置。

文档和示例根据 MIT