zoukankan      html  css  js  c++  java
  • Typescript+React封装路由拦截组件

    需求:离开切换页面检测是否保存,点击确认跳转相应路由,取消则留在本页

     react-router取消了路由守卫,自带组件Prompt可以进行路由拦截,后面借助antd的Modal封装成弹窗组件

    import { Modal } from 'antd'
    import * as React from 'react'
    import { Prompt, useHistory } from 'react-router'

    interface IRouterPromptProps {
      isBlock: boolean
      title?: string
      content?: string
      onOk?: () => void
    }

    /**
     * 路由拦截组件
     * 监听页面跳转是否需要保存信息
     */
    export const RouterPrompt = React.memo((props: IRouterPromptProps) => {
      const history = useHistory()
      const [isBlock, setIsBlock] = React.useState(props.isBlock)

      React.useEffect(() => {
        setIsBlock(props.isBlock)
      }, [props.isBlock])

      const handleClick = (location: any, action: string, type: string) => {
        if (type === 'ok') {
          setTimeout(() => {
            if (action === 'POP') {
              history.goBack()
            } else if (action === 'PUSH') {
              history.push(location)
            } else {
              history.replace(location)
            }
          }, 100)
          setIsBlock(false)
          // console.log('我已确认')
        }
      }

      return (
        <Prompt
          when={isBlock}
          message={(location, action) => {
            Modal.confirm({
              title: props.title ? props.title : '提醒',
              content: props.content ? props.content : '修改的内容尚未保存,是否继续',
              okText: '确定',
              cancelText: '取消',
              onOk: () => handleClick(location, action, 'ok'),
              onCancel: () => handleClick(location, action, 'cancel')
            })
            return false
          }}
        />
      )
    })

    export default RouterPrompt

    使用:在需要拦截的页面导入,在任一处使用

    import RouterPrompt from 'yourroute/RouterPrompt'
    <RouterPrompt isBlock title="提醒" content="修改的内容尚未保存,是否继续" />
    

      

  • 相关阅读:
    【设计模式】责任链模式
    python 获取cookie,发送请求
    python requests报错:Exception: ('Connection broken: IncompleteRead(3794 bytes read, 4398 more expect ed)', IncompleteRea
    获取二维数组 所有的组合排列
    tp3.0 验证码生成和使用
    MySQL: mysql is not running but lock exists 的解决方法
    [RxSwift]4.2.0、Observer
    [RxSwift]4.1.6、ControlEvent
    [RxSwift]4.1.5、Signal
    [RxSwift]4.1.4、Driver
  • 原文地址:https://www.cnblogs.com/leise/p/15015600.html
Copyright © 2011-2022 走看看