• 使用react-draggable和react-resizable实现Ant Design Modal的拖动和拖拽改变宽度


    使用react-draggable和react-resizable实现Ant Design Modal的拖动和拖拽改变宽度

    需求

    Ant Design 提供的Modal是不支持拖动还有侧边拖拽改变宽度的,基于这一点我们需要自定义一个我们自己的Modal组件,来实现拖动和拖拽改变宽度。

    其中会用到的技术有:使用react-draggable来实现modal的拖动,使用react-resizable来实现拖拽改变宽度。

    实现

    首先实现拖动这个比较简单,直接引入react-draggable,然后使用包裹一下就可以了,网上案例很多,不具体讲。 唯一比较特别的是,如果你直接包裹在外面是无法实现拖拽的,而是要在中的modalRender属性中进行的包裹。还有一点需要注意的是拖动的时候需要设置一下不能超出当前可视窗口。

    实现拖拽改变宽度也不难,也是引入react-resizable,然后用包裹一下就可以了,但是需要设置width,并且是number类型。还有一点需要注意的是,需要设置一下modal最小的宽度,防止拖拽改变宽度太小导致modal里面的内容样式错乱。

    参考代码

    import Draggable, {DraggableBounds, DraggableData, DraggableEvent} from 'react-draggable'
    import {Modal, ModalProps} from "antd";
    import React, {useLayoutEffect, useRef, useState} from "react";
    import './index.css';
    import {Resizable} from "react-resizable";
    
    interface DraggableModalProps extends ModalProps {
      modalMinWidth?: number,
      width?: number
    }
    
    const DraggableModal: React.FC<DraggableModalProps> = (props: any) => {
    
      const [bound, setBound] = useState<DraggableBounds>({left: 0, top: 0, bottom: 0, right: 0})
      const modalRef = useRef();
      const draggableRef = useRef();
      const {children, ...other} = props;
      const [resizableWidth, setResizableWidth] = useState<number>(props.width || 0);
      const resizeableSpaceWidth = 5;
      const defaultMinSize = 400;
      const onStart = (event: DraggableEvent, draggableData: DraggableData) => {
        const {clientWidth, clientHeight} = window?.document?.documentElement;
        const targetRect = (draggableRef?.current as any)?.getBoundingClientRect();
        setBound({
          left: -targetRect?.left + draggableData?.x,
          right: clientWidth - (targetRect?.right - draggableData?.x) - resizeableSpaceWidth,
          top: -targetRect?.top + draggableData?.y,
          bottom: clientHeight - (targetRect?.bottom - draggableData?.y)
        })
      };
    
      useLayoutEffect(() => {
        setResizableWidth(props.width || defaultMinSize);
      }, [props.width])
    
      const onResize = (e: React.SyntheticEvent<Element, Event>, {size}: any) => {
        if (size.width < (props.modalMinWidth || defaultMinSize)) {
          setResizableWidth(props.modalMinWidth || defaultMinSize);
        } else {
          setResizableWidth(size.width);
        }
      }
    
    
      return (
        <Modal {...other} ref={modalRef}
               width={resizableWidth}
               modalRender={modal => (
                 <Draggable handle={'.ant-modal-header'}
                            bounds={bound}
                            onStart={(event, uiData) => onStart(event, uiData)}>
                   {/* @ts-ignore*/}
                   <div ref={draggableRef} className={'draggable-modal'}>
                     <Resizable width={resizableWidth} height={0}
                                onResize={onResize}>
                       {modal}
                     </Resizable>
    
                   </div>
                 </Draggable>
               )}>
          {children}
        </Modal>
    
      );
    }
    
    export default DraggableModal;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    参考

    React Draggable 实现拖拽 - 最详细中文教程 - 卡拉云

    React 拖拽改变大小,react-resizable 属性详解

    antd modal拖拽,自定义modal拖拽react-draggable

    react-modal-draggable

  • 相关阅读:
    Matlab | 找出数组/向量中的重复项的索引
    AutoML
    [UE]常见C++类继承关系
    专利申请流程所需时间是怎样的?
    CNN卷积神经网络之卷积
    1.UEFI环境搭建
    设置visual studio代码自动提示
    Spring5学习笔记04--Bean后处理器
    某大学R语言期末作业
    Homebrew国内和国外如何自动安装(Mac & Linux)
  • 原文地址:https://blog.csdn.net/cckevincyh/article/details/127971899