react-router 重新加回跳转拦截功能详解

 更新时间:2023年02月08日 14:37:52   作者:马格纳斯  
这篇文章主要为大家介绍了react-router 重新加回跳转拦截功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

路由的跳转拦截,在一些表单页中尤为常见。场景:用户输入了一些信息后但未提交,为了防止用户误点击某个跳转链接导致所填的表单信息丢失,跳转之前会弹出一个提示,如 “信息未提交,请确认是否离开” 等字样。

事件经过

react-router v6 之前有提供一个 <Prompt /> 组件来拦截路由的跳转。而在 v6 中却不支持此功能了!社区一片哀嚎,经查在 v6 实验阶段是有此功能的,但在 v6.0.0 beta-7 中删除了此功能。在这个 issue 链接 中每个人都强烈要求需要此功能,但官方回复会在不久的将来添加,有需要的可以回退到 v5,基本所有人都表示 👎。然而这一等就是一年多,很多人这期间在 issue 中表示非常失望,这个不久的将来 到底还有没有了?终于在 v6.7.0 重新加入了此功能,原来不久的将来约等于一年。

v6 之前的版本如何拦截

在你需要拦截的页面添加 <Prompt /> 组件,我们在输入框中有值,且进行跳转页面时进行拦截。当 when 为 true 时,执行跳转会触发拦截操作,message 为提示。

function Home() {
  const [value, setValue] = useState("");
  return (
    <div>
      <Link to="/about" />
      <input value={value} onChange={e => setValue(e.target.value)} />
      <Prompt when={!!value} message="确认要离开吗" />
    </div>
  );
}

弹出的提示进行自定义,when 可以设置为一个函数,参数为 locationaction(行为),返回 string | boolean。返回 stringtrue 就是直接离开了。

function Home() {
  const [value, setValue] = useState("");
  const history = useHistory();
  return (
    <div>
      <Link to="/about" />
      <input value={value} onChange={(e) => setValue(e.target.value)} />
      <Prompt
        when={!!value}
        message={(location, action) => {
          Modal.confirm({
            message: "确定要离开吗",
            onOk: () => {
              history.push(location.pathname);
            },
          });
          return false;
        }}
      />
    </div>
  );
}

v6.7.0+ 如何拦截

在这个版本中提供了一个 unstable_useBlocker 钩子,但在文档中是没有的(艹),需要自己去 examples 里找。useBlocker 传入的参数类似于上面的 when

useBlocker 的参数为 boolean函数返回 boolean,函数的类型如下:

(args: {
    currentLocation: Location;
    nextLocation: Location;
    historyAction: HistoryAction;
}) =&gt; boolean

blocker 里的 stateblocked 时,说明当前正在进行拦截,此时弹出一个 Modal,点击确认就是进行跳转,点击取消就是不跳转。blocked 中还能获取到 location,可以根据你的需要来使用。

import { unstable_useBlocker as useBlocker } from "react-router-dom";
function Home() {
  const [value, setValue] = useState("");
  const blocker = useBlocker(!!value);
  useEffect(() => {
    if (blocker.state === "blocked") {
      Modal.confirm({
        message: "确认离开吗",
        onOk: () => {
          blocker.proceed?.();
        },
        onCancel: () => {
          blocker.reset?.();
        },
      });
    }
  }, [blocker]);
  return (
    <div>
      <Link to="/about" />
      <input value={value} onChange={(e) => setValue(e.target.value)} />
    </div>
  );
}

吐槽

最后,就在这里吐槽一下吧。文档很烂,不支持搜索!且 v6.4 的后续版本中加入了很多 api,例如 actionloader 的概念,跟数据请求有关。但是我觉得很难用,路由库就应该只专注路由,应该跟它们的 remix 框架的发展有关吧。官方的权限控制例子也是不好用,很麻烦。下个文章会写在 v6 中如何优雅简单的管理权限。

以上就是react-router 重新加回跳转拦截功能详解的详细内容,更多关于react router 跳转拦截的资料请关注脚本之家其它相关文章!

相关文章

  • React新文档切记不要滥用effect

    React新文档切记不要滥用effect

    这篇文章主要为大家介绍了React新文档滥用effect出现的问题详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • React反向代理及样式独立详解

    React反向代理及样式独立详解

    这篇文章主要介绍了React反向代理及样式独立详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • 解析TypeError:import_react_native.AppState.removeEventListener is not a function

    解析TypeError:import_react_native.AppState.removeEventListener

    这篇文章主要为大家介绍了TypeError:import_react_native.AppState.removeEventListener is not a function问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • react使用axios实现上传下载功能

    react使用axios实现上传下载功能

    这篇文章主要为大家详细介绍了react使用axios实现上传下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • React中组件通信的几种主要方式

    React中组件通信的几种主要方式

    React知识中一个主要内容便是组件之间的通信,以下列举几种常用的组件通信方式,通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-10-10
  • 一文学会使用Remix写API接口

    一文学会使用Remix写API接口

    这篇文章主要为大家介绍了一文学会Remix写API接口实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • React中的refs的使用教程

    React中的refs的使用教程

    本篇文章主要介绍了React中的refs的使用教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • React项目开发中函数组件与函数式编程关系

    React项目开发中函数组件与函数式编程关系

    函数组件和函数式编程究竟是什么关系呢?本文会围绕这个话题展开讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • react纯函数组件setState更新页面不刷新的解决

    react纯函数组件setState更新页面不刷新的解决

    在开发过程中,经常遇到组件数据无法更新,本文主要介绍了react纯函数组件setState更新页面不刷新的解决,感兴趣的可以了解一下
    2021-06-06
  • React中Redux Hooks的使用详解

    React中Redux Hooks的使用详解

    这篇文章主要介绍了React Redux Hooks的使用详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论