91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

react如何實現路由跳轉前確認

發布時間:2023-01-28 14:19:41 來源:億速云 閱讀:177 作者:iii 欄目:web開發

這篇文章主要介紹“react如何實現路由跳轉前確認”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“react如何實現路由跳轉前確認”文章能幫助大家解決問題。

react實現路由跳轉前確認功能的方法:1、通過“import { Modal } from 'antd';”方法引入“antd”;2、使用Antd的“Modal.confirm”實現彈框;3、設置Form表單內容即可。

react-router 跳轉前確認Prompt使用

需求

頁面切換的時候,會遇到這樣的需求:切換時需要判斷內容區域編輯后是否保存了, 若沒保存,則彈出提示框,提示保存。

react如何實現路由跳轉前確認

官網示例

react router中的Prompt可以實現這樣的功能。

/** when:是否啟用 */
/** message:string | func */
// 示例1
<Prompt
  when={formIsHalfFilledOut}
  message="Are you sure you want to leave?"
/>
// 示例2
<Prompt
  message={(location, action) => {
    if (action === 'POP') {
      console.log("Backing up...")
    }
    return location.pathname.startsWith("/app")
      ? true
      : `Are you sure you want to go to ${location.pathname}?`
  }}
/>

實現

我們項目的技術棧umi+antd+react

彈框用的Antd的 Modal.confirm

import React, { useEffect, useState } from 'react';
import { Modal } from 'antd';
import { useBoolean } from '@umijs/hooks';
// umi里封裝了該組件
// 或者 import { Prompt } from "react-router-dom";
import { useParams, history, Prompt } from 'umi';
import {
  ExclamationCircleOutlined
} from '@ant-design/icons';
import {  isEqual } from '@/utils/utils';
import { FormInstance } from 'antd/lib/form';
export default function BaseInfo() {
  const { id } = useParams<{ id: string }>(); 
  // 保留原始數據
  const [orginData, setOrigin] = useState({});
  // 修改后的數據
  const [modifyData, setModify] = useState({});
  // 是否啟用Prompt
  const { state, setTrue, setFalse } = useBoolean(false);
  // 還原信息 useLoading是自己封裝的hooks
  const [isFetching, fetchInfo] = useLoading(getServiceGroupDetail);
  useEffect(() => {
    (async () => {
      try {
        if (id !== '0') {
          const info = await fetchInfo(id);
          setOrigin({
            ...info 
          });
          setModify({
            ...info 
          });          
        }
      } catch (e) {
        console.error(e);
      }
    })();
  }, [id]);
  useEffect(() => {
    if (isEqual(orginData, modifyData)) {
      setFalse();
    } else {
      setTrue();
    }
  }, [orginData, modifyData]);
  const nextStep = (pathname?: string) => {
    setFalse();
    pathname &&
      setTimeout(() => {
        history.push(pathname);
      });
  };
  return (
      {/* 這里原來放的Form表單內容 */}
      {routerWillLeave(state, form, nextStep)}
  );
}
function routerWillLeave(
  isPrompt: boolean | undefined,
  formInstance: FormInstance, // 保存,我這個頁面是Form表單
  nextStep: (pathname?: string) => void
) {
  return (
    <div>
      <Prompt
        when={isPrompt}
        message={(location) => {
          if (!isPrompt) {
            return true;
          }
          Modal.confirm({
            icon: <ExclamationCircleOutlined />,
            content: '暫未保存您所做的更改,是否保存?',
            okText: '保存',
            cancelText: '不保存',
            onOk() {
              formInstance?.submit();
              nextStep(location.pathname);
            },
            onCancel() {
              nextStep(location.pathname);
            }
          });
          return false;
        }}
      />
    </div>
  );
}

關于“react如何實現路由跳轉前確認”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

资兴市| 平塘县| 灵宝市| 八宿县| 南岸区| 锦州市| 乐业县| 寻甸| 沁阳市| 台东市| 兴化市| 双鸭山市| 扎鲁特旗| 宁南县| 伽师县| 怀安县| 延寿县| 天台县| 抚远县| 华安县| 抚顺县| 开远市| 西昌市| 乳山市| 牙克石市| 友谊县| 阳曲县| 南木林县| 阿勒泰市| 和政县| 宁津县| 阳城县| 犍为县| 赣榆县| 丽江市| 专栏| 南安市| 江孜县| 广宗县| 开封县| 永胜县|