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

文章目录

    • 使用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

相关内容

热门资讯

一咬一腿包,黑虎泉灭蚊灯何时“... 齐鲁晚报·齐鲁壹点 石晟绮 入夏后,济南降雨频繁,空气湿热,蚊虫渐渐地“活跃”起来。近日,不少市民游...
温州小伙带女友来长沙,热得第二... 近日,长沙持续高温天气,最高温度达到39℃。不少来到长沙游玩的全国游客们纷纷表示,“太热了!” 记者...
第二十二届中国(滕州)微山湖红... 旅新网山东滕州讯(本网记者 党同生) 7月5日,记者在滕州市政府新闻办举行的发布会上获悉,第二十二届...
伊犁风情6天5晚小团纯玩,邂逅... 伊犁风情6天5晚小团纯玩,邂逅赛里木湖与库尔德宁 新疆旅游咨询: 小敏18509915393 小钰1...
送了杯西瓜汁给自己喜欢的女孩,... 送了杯西瓜汁给自己喜欢的女孩,她说你怕也不是疯了是什么意思?意思也就是说,这杯西瓜汁呢,女生不愿意接...
你说我不懂爱 还有一句是 如果... 你说我不懂爱 还有一句是 如果你没有这样悄悄默默的走 这是什么歌啊?是郭晓杰的《心痛后明白》吗?
请大家给我介绍好听的歌曲,dj... 请大家给我介绍好听的歌曲,dj也行迈克尔杰克逊
心伤透了是不是就没心了! 心伤透了是不是就没心了!可爱的楼主,当然不是啊。你现在的心,无非是被那个把你的心伤透了的人带走了。如...
仙剑奇侠传3中的主要人物是谁扮... 仙剑奇侠传3中的主要人物是谁扮演的景天——胡歌长卿——霍建华雪见——杨幂紫萱——唐嫣花楹——郭晓婷胡...
夏河洛洛是什么时候开始恋爱的? 夏河洛洛是什么时候开始恋爱的?大概07年吧。在一起近三年,大概推算的
我大话2想玩男人 现在已经两世... 我大话2想玩男人 现在已经两世男魔了 我是平民 接下来怎么转 怎么玩?主要想玩混男人嗯两世男魔转男人...
爱(艾)滋病在空气中生存时间 爱(艾)滋病在空气中生存时间放心吧,爱(艾)滋病在空气中是不能生存的
放羊的星星中所有的歌曲叫什么名... 放羊的星星中所有的歌曲叫什么名字01极速爱情-李雅微02对望-林志颖03paradise-李雅微04...
MAS曳步舞 是什么意思? MAS曳步舞 是什么意思?是一种风格,巴西风格的马来西亚风格
死神是神还是鬼脑筋急转弯 死神是神还是鬼脑筋急转弯鬼。死神是地狱的使者,说他是鬼不恰当,说他是神又没到那境界,但是说白了他就是...
科学练习册(牛津上海版)七年级... 科学练习册(牛津上海版)七年级上第九章电力与电信答案跪求啊~~17~36 D B A C C D C...
加刘三姐对歌歌词 加刘三姐对歌歌词 “男方:什么水面打跟斗呢,什么水面起高楼呢,什么水面撑阳伞,什么水面共白头?刘三姐...
怒与什么什么的成语 怒与什么什么的成语 怒开头的成语:怒不可遏、怒火中烧、怒气冲冲、怒形于色、怒气冲天、怒火冲天、怒...
女孩,姓王,阳历2008年3月... 女孩,姓王,阳历2008年3月7日,出生时间:下午16:52分, 请高人按生辰八字起名!急 急八字:...
NO是表示没有吗? NO是表示没有吗?表示否定的意思,没有,不是,无等等。