看之前可以了解一下拖拽的原理 html5拖放-CSDN博客

(给自己博客打的广告,推广一下,想了解的可以看一下,不想了解的可以忽略)

1.react-rnd 是什么

react-rnd 是一个React 组件库,可以提供一个可调整大小与可拖拽的组件。

rnd 的意思是:resizable and draggable(可调整大小和可拖动)

2.安装

使用 npm

npm i -S react-rnd

使用 yarn

yarn add react-rnd

3.核心

React RND的核心依赖于React的生命周期方法和CSS Transform属性。它使用了ref来获取DOM元素,然后借助event处理函数监听鼠标事件,实现了拖动和缩放的功能。同时,为了保持组件的响应式,它利用CSS的transform属性而非直接改变元素的宽高,这样可以避免页面的频繁重绘,提高性能。

此外,React RND还支持以下关键特性:

  • 边界检测:组件可以限制其拖动或缩放的范围。
  • 可配置性:允许自定义拖动和缩放的行为,例如拖动的手柄、是否启用某些行为等。
  • 动画:内置平滑过渡效果,提供更好的用户体验。
  • 拥抱React Hooks:尽管支持老版本的React,但最新版本已全面采用React Hooks进行重构,更符合现代React的开发模式。

4.使用例子

基本用法

<Rnd
  default={{
    x: 0,
    y: 0,
    width: 320,
    height: 200,
  }}
>
  Rnd
</Rnd>

实例

 <Rnd
        size={boxSize}
        position={boxPosition}
        dragHandleClassName='selectdSetPosition'
        //开始拖放时调用
        onDragStart={() => setDragging(true)}
        //拖动停止时调用
        onDragStop={(_, d) => handleDragStop(d)}
        // 开始调整大小时调用
        onResizeStart={() => setDragging(true)}
        // 组件停止调整大小时调用
        onResizeStop={(_, direction, ref) => handleResizeStop(direction, ref)}
        //是否可以拉大小
        enableResizing={{
          top: false,
          bottom: true,
          left: true,
          right: true,
        }}
      >
<div></div> 
</Rnd>

5.属性

  • default: { x: number; y: number; width?: number | string; height?: number | string;};                设定默认的一些属性,如初始坐标和宽高
  • size?: { width: (number | string), height: (number | string) };  组件的大小,即宽度与高度
  • position?: { x: number, y: number };  组件的坐标,即横坐标与纵坐标
  • resizeGrid?: [number, number];   重置大小时的增量,默认为[1, 1]
  • dragGrid?: [number, number];    拖拽时的增量,默认为[1, 1]
  • lockAspectRatio?: boolean | number;    锁定纵横比,可设置为布尔值或数字值,当设置为true时,组件会锁定纵横比,并且该值为组件初始宽高的比值;而设置为数字时,组件调整大小时会以该值作为纵横比来调整
  • enableResizing?: ?Enable   用以设置是否可调整大小,可从组件各个方向上或整体来设置:
export type Enable = {
  bottom?: boolean;
  bottomLeft?: boolean;
  bottomRight?: boolean;
  left?: boolean;
  right?: boolean;
  top?: boolean;
  topLeft?: boolean;
  topRight?: boolean;
} | boolean
  • disableDragging?: boolean;     是否禁用拖拽
  • dragAxis?: 'x' | 'y' | 'both' | 'none'    设置组件的拖拽方向
  • bounds?: string;    组件的边界:可设置为父组件的名称或者window、body或者一个选择器的名称(需要带上符号. or #)

6.回调函数

onResizeStart?: RndResizeStartCallback; // 开始调整大小时调用

onResize?: RndResizeCallback; // 组件调整大小时调用

onResizeStop?: RndResizeCallback; // 组件停止调整大小时调用

onDragStart: DraggableEventHandler; // 组件开始拖拽时调用

onDrag: DraggableEventHandler; // 组件拖拽时调用

onDragStop: DraggableEventHandler; // 组件停止拖拽时调用

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部