首页 > 其他分享 >React可拖拽缩放组件react-rnd

React可拖拽缩放组件react-rnd

时间:2022-11-08 09:36:31浏览次数:89  
标签:缩放 number rnd react boolean 组件 type 拖拽

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

一、安装

使用 npm

npm i -S react-rnd

使用 yarn

yarn add react-rnd

二、使用方法

基本用法

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

使用position和size的例子

<Rnd
  size={{ width: this.state.width,  height: this.state.height }}
  position={{ x: this.state.x, y: this.state.y }}
  onDragStop={(e, d) => { this.setState({ x: d.x, y: d.y }) }}
  onResizeStop={(e, direction, ref, delta, position) => {
    this.setState({
      width: ref.style.width,
      height: ref.style.height,
      ...position,
    });
  }}
>
  123
</Rnd>

三、属性

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或者一个类选择器的名称

四、回调函数

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

export type RndResizeStartCallback = (
  e: SyntheticMouseEvent<HTMLDivElement> | SyntheticTouchEvent<HTMLDivElement>,
  dir: ResizeDirection,
  refToElement: React.ElementRef<'div'>,
) => void;

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

export type RndResizeCallback = (
  e: MouseEvent | TouchEvent,
  dir: ResizeDirection,
  refToElement: React.ElementRef<'div'>,
  delta: ResizableDelta,
  position: Position,
) => void;

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

export type RndResizeCallback = (
  e: MouseEvent | TouchEvent,
  dir: ResizeDirection,
  refToElement: React.ElementRef<'div'>,
  delta: ResizableDelta,
  position: Position,
) => void;

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

type DraggableData = {
  node: HTMLElement,
  x: number,
  y: number,
  deltaX: number, deltaY: number,
  lastX: number, lastY: number
};

type DraggableEventHandler = (
  e: SyntheticMouseEvent | SyntheticTouchEvent, data: DraggableData,
) => void | false;

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

type DraggableData = {
  node: HTMLElement,
  x: number,
  y: number,
  deltaX: number, deltaY: number,
  lastX: number, lastY: number
};

type DraggableEventHandler = (
  e: SyntheticMouseEvent | SyntheticTouchEvent, data: DraggableData,
) => void | false;

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

type DraggableData = {
  node: HTMLElement,
  x: number,
  y: number,
  deltaX: number, deltaY: number,
  lastX: number, lastY: number
};

type DraggableEventHandler = (
  e: SyntheticMouseEvent | SyntheticTouchEvent, data: DraggableData,
) => void | false;

实例API

updateSize(size: { width: string | number, height: string | number })
用以调整组件的大小
updatePosition({ x: number, y: number }): void
用以调整组件的位置
allowAnyClick?: boolean
如果设置为true,则允许非左键点击拖拽

附:

github地址:https://github.com/bokuweb/react-rnd

如果仅需实现拖拽功能,无需缩放功能,也可使用 react-draggable 组件 https://kalacloud.com/blog/react-draggable-tutorial/

标签:缩放,number,rnd,react,boolean,组件,type,拖拽
From: https://www.cnblogs.com/ZerlinM/p/16868576.html

相关文章

  • 前端工程师的20道react面试题自检
    什么是ReactFiber?Fiber是React16中新的协调引擎或重新实现核心算法。它的主要目标是支持虚拟DOM的增量渲染。ReactFiber的目标是提高其在动画、布局、手势、暂停......
  • 一天梳理完React所有面试考察知识点
    性能优化性能优化,永远是面试的重点,性能优化对于React更加重要在页面中使用了setTimout()、addEventListener()等,要及时在componentWillUnmount()中销毁使用异步组件......
  • 你需要的react面试高频考察点总结
    Component,Element,Instance之间有什么区别和联系?元素:一个元素element是一个普通对象(plainobject),描述了对于一个DOM节点或者其他组件component,你想让它在屏幕上呈......
  • Web on Reactive Stack
    目录1、SpringWebFlux1.1、Overview1.2、ReactiveCore1.3、DispatcherHandler1.4、AnnotatedControllers1.5、FunctionalEndpoints1.6、URILinks1.7、CORS1.8、WebSe......
  • React错误记录
    React错误记录在React18中使用lazy报错react.development.js:1363UncaughtTypeError:Cannotreadpropertiesofundefined(reading'then')atlazyInitializer......
  • 注册IRP_MJ_SHUTDOWN事件 基于ReactOS0303
      系统关闭时,会向注册SHUTDOWN事件的设备驱动发送IRP_MJ_SHUTDOWN事件。NTSTATUSSTDCALLNtShutdownSystem(INSHUTDOWN_ACTIONAction){if(Action>ShutdownPowe......
  • React中常见的TypeScript定义实战
    一引沿Fiber架构是React16中引入的新概念,目的就是解决大型React应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是R......
  • React-hooks+TypeScript最佳实战
    ReactHooks什么是HooksReact一直都提倡使用函数组件,但是有时候需要使用state或者其他一些功能时,只能使用类组件,因为函数组件没有实例,没有生命周期函数,只有类组件才......
  • React-diff原理及应用
    抛砖引玉React通过引入VirtualDOM的概念,极大地避免无效的Dom操作,已使我们的页面的构建效率提到了极大的提升。但是如何高效地通过对比新旧VirtualDOM来找出真正的Dom变......
  • React源码中的dom-diff
    这一章就来讲讲React在协调阶段的beginWork里面主要做的事情--domdiff。本文主要讲的是React17.0.2版本的diff,在此我也画了一个简单的流程图:reconcileChildrendomd......