react-router 的 useBlocker 路由拦截

开始之前

路由拦截功能是很常见的,功能。比如:我们的表单没有填写完毕,用户就就要跳转,此时我们需要拦截与确认。在 React-router v6 之前提供了 Prompt 组件用于拦截跳转。React Router v6.19.0 版本之后,开始移除 unstable_ 不稳定的前缀变的正式可用

remix 中 useBlocker 从 v2.3.0 开始

Remix 中 useBlocker 钩子函数,从 v2.3.0 开始能够正式使用。

useBlocker 的用法

useBlocker 是一个钩子函数,此钩子函数需要接受一个函数作为参数(或者是 boolean 的值),以下是 useBlocker 相关的 TS 类型:

ts 复制代码
export declare function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker;

export type BlockerFunction = (args: {
    currentLocation: Location;
    nextLocation: Location;
    historyAction: HistoryAction;
}) => boolean;

export type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;

interface BlockerBlocked {
    state: "blocked";
    reset(): void;
    proceed(): void;
    location: Location;
}
interface BlockerUnblocked {
    state: "unblocked";
    reset: undefined;
    proceed: undefined;
    location: undefined;
}
interface BlockerProceeding {
    state: "proceeding";
    reset: undefined;
    proceed: undefined;
    location: Location;
}

以上是 useBlocker 相关的类型,这些类型

特点

  • useBlocker 拦截的是通过 react-router 导航
  • 如果手动点击浏览器的导航按钮,useBlocker 是不能拦截的

Remix 中使用示例

tsx 复制代码
import React from "react";
import { Button, Form, Modal } from "antd";
import { Link, useBlocker } from "@remix-run/react";


export default 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">Save</button>
      <br />
      <Button>
        <Link to="/">home</Link>
      </Button>

      {blocker.state === "blocked" ? (
        <div>
          <Modal
            title="Are you sure you want to leave?"
            open={blocker.state === "blocked"}
            onOk={() => blocker.proceed()}
            onCancel={() => blocker.reset()}
          >
            <p>Some contents...</p>
            <p>Some contents...</p>
            <p>Some contents...</p>
          </Modal>
        </div>
      ) : null}
    </Form>
  );
}

小结

本文主要介绍 React Router 的 useBlocker 的用法,以及基本使用案例。useBlocker 在 v6.19.0 开始正式使用,相比对路由拦截有需求的朋友这个 api 一定非常受用。

相关推荐
颜酱34 分钟前
前缀和技巧全解析:从基础到进阶
javascript·后端·算法
CappuccinoRose38 分钟前
HTML语法学习文档(九)
前端·学习·架构·html5
NEXT0639 分钟前
BFC布局
前端·css·面试
菜鸟小芯1 小时前
【GLM-5 陪练式前端新手入门】第四篇:卡片布局 —— 让个人主页内容更有层次
前端·人工智能
源码获取_wx:Fegn08951 小时前
计算机毕业设计|基于springboot + vue鲜花销售管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Hello.Reader1 小时前
Leptos + Tauri 2 前端配置Trunk + SSG + 移动端热重载一次打通(Leptos 0.6 口径)
前端
岱宗夫up1 小时前
【前端基础】HTML + CSS + JavaScript 进阶(一)
开发语言·前端·javascript·css·html
毕设源码-赖学姐1 小时前
【开题答辩全过程】以 基于SpringBoot 的个人健康分析指导系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
源代码•宸1 小时前
简版抖音项目——项目需求、项目整体设计、Gin 框架使用、视频模块方案设计、用户与鉴权模块方案设计、JWT
经验分享·后端·golang·音视频·gin·jwt·gorm
qq_24218863321 小时前
【零基础使用Trae CN编写第一个AI游戏教程】
开发语言·前端·人工智能·python·游戏·html