使用react-draggable和react-resizable实现Ant Design Modal的拖动和拖拽改变宽度
admin
2024-02-06 04:52:27

文章目录

    • 使用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 = (props: any) => {const [bound, setBound] = useState({left: 0, top: 0, bottom: 0, right: 0})const modalRef = useRef();const draggableRef = useRef();const {children, ...other} = props;const [resizableWidth, setResizableWidth] = useState(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, {size}: any) => {if (size.width < (props.modalMinWidth || defaultMinSize)) {setResizableWidth(props.modalMinWidth || defaultMinSize);} else {setResizableWidth(size.width);}}return (...other} ref={modalRef}width={resizableWidth}modalRender={modal => ('.ant-modal-header'}bounds={bound}onStart={(event, uiData) => onStart(event, uiData)}>{/* @ts-ignore*/}
draggableRef} className={'draggable-modal'}>resizableWidth} height={0}onResize={onResize}>{modal}
)}>{children}
); }export default DraggableModal;

参考

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

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

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

react-modal-draggable

相关内容

热门资讯

山水皆有情!丽江两山一江的千年... 去过丽江、走过虎跳峡的人,大概率都听过哈巴雪山和金沙江的传说。很多人站在峡谷之下,望着奔腾不息的金沙...
活力中国调研行丨“殷”你而来 ... 9月12日,游客在殷墟博物馆“甲骨文展厅”内参观。位于河南省安阳市的殷墟博物馆新馆是首个全景式展现商...
浦江之夜赴美好相逢,第37届上... 9月12日晚,黄浦江畔灯火璀璨,第37届上海旅游节大巡游在外滩中山东一路上演。不少观众早早便来到外滩...
美丽中国丨秋韵紫鹊界 梯田入画... 这是9月11日拍摄的紫鹊界梯田(无人机照片)。 金秋九月,湖南省娄底市新化县紫鹊界梯田稻谷渐次成熟。...
中国之巅奏响《共同的节日》,千... 千吨阻尼器,“迎世赛、游上海旅游节”。9月13日,由上海市文化和旅游局指导推出上海旅游·会客│巅峰之...