当前位置: 首页 > article >正文

【React】刷新页面或跳转路由时进行二次确认

文章目录

    • 封装hook
    • 使用hook

封装hook

import { useEffect, useRef } from 'react';
import { Prompt, useHistory, useLocation } from 'react-router-dom';

/**
 * 窗口关闭前提醒用户
 *
 * 参考:https://developer.mozilla.org/en-US/docs/Web/API/BeforeUnloadEvent
 */
export default function useWindowBeforeUnload(getMessage: () => string | undefined) {
  const location = useLocation();
  const history = useHistory();

  const ref = useRef({
    pathname: location.pathname,
  }).current;

  useEffect(() => {
    // 定义提示函数
    const promptBeforeUnload = (event: BeforeUnloadEvent) => {
      const message = getMessage();
      console.log('message before unload', message);

      if (!message) return;

      // 设置提示信息
      event.preventDefault();
      event.returnValue = message;
      return message;
    };

    // 监听 onbeforeunload 事件
    window.addEventListener('beforeunload', promptBeforeUnload);
    return () => window.removeEventListener('beforeunload', promptBeforeUnload);
  });

  //  hash 路由下存在问题,需要谨慎使用
  // 问题:跳转时如果取消了,路由依然会发生辩护,导致下次跳转相同路由,不会出现提示,且刷新页面会进入到目标页面
  const renderPrompt = () => (
    <Prompt
      when={!!getMessage()}
      message={(location, action) => {
        const message = getMessage();
        if (message) return `${message}(即将跳转:${location.pathname}${location.search}`;
        return false;
      }}
    />
  );

  return { renderPrompt };
}

使用hook

import useWindowBeforeUnload from '@/hooks/useWindowBeforeUnload';

export default function () {
  const { renderPrompt } = useWindowBeforeUnload(() => {
    return '如果有未保存的修改,离开后将会丢失!';
  });

  return (
    <div>
      {renderPrompt()}
    </div>
  );
}


http://www.kler.cn/a/470417.html

相关文章:

  • C++list
  • C#高级:递归4-根据一颗树递归生成数据列表
  • unity学习13:gameobject的组件component以及tag, layer 归类
  • 2025最新版Visual Studio Code安装使用指南
  • 小白学Pytorch
  • FreeSWITCH dialplan/default.xml 之释疑
  • 【问题记录】SpringBoot 解决 getReader() has already been called for this request 错误
  • F#语言的计算机基础
  • HTML - <link>
  • 03、MySQL安全管理和特性解析(DBA运维专用)
  • Python:类方法、实例方法与静态方法深度解析(补)
  • (安卓无线调试)ADB 无法连接及 Scrcpy 问题排查指南
  • 机器学习算法---贝叶斯学习
  • 城市安全风险综合监测预警平台
  • 阿里云 人工智能与机器学习
  • 动漫推荐系统django+vue前台后台完整源码
  • 这是什么操作?强制迁移?GitLab 停止中国区用户访问
  • 专业学习|BFS算法介绍以及实现框架
  • RK3588平台开发系列讲解(系统篇)Linux Kconfig的语法
  • AI赋能运维:实现运维任务的智能化自动分配
  • 2025.1.2
  • CE中注册的符号地址如何通过编程获取
  • [开源]自动化定位建图系统
  • ETL处理工具Kettle入门
  • 如何开通阿里云DDoS保护服务:全面防护您的网站安全
  • 让Qt 具有多选文件夹和记忆上一次打开位置的文件对话框