Skip to content

kakajun/react-es-drager

Folders and files

NameName
Last commit message
Last commit date

Latest commit

b3d6ebf · Dec 10, 2024

History

87 Commits
Dec 1, 2024
Nov 12, 2024
Dec 10, 2024
Nov 5, 2024
Nov 23, 2024
Oct 7, 2024
Dec 5, 2024
Nov 23, 2024
Dec 3, 2024
Dec 10, 2024
Sep 25, 2024
Nov 23, 2024
Oct 7, 2024
Oct 7, 2024
Oct 7, 2024

Repository files navigation

Rect Es Drager 拖拽组件

Rect Es Drager
Draggable Resizable Rotatable

🌈介绍

基于 react18 + typescript + vite 的可拖拽、缩放、旋转的组件

  • 拖拽&区域拖拽
  • 支持缩放
  • 旋转
  • 网格拖拽缩放
  • 拖拽编辑器

运行项目

# 拉取项目
git clone https://github.com/kakajun/react-es-drager.git

# 安装依赖
pnpm install

# 运行项目
pnpm dev

# 打包drager组件
pnpm build

# 打包文档
pnpm build:demo

主要目录介绍

目录 功能说明
packages/docs 项目示例文档、编辑器展示
packages/editor 编辑器核心代码
packages/drager es-drager组件

综合案例

下面是基于 react-es-drager 实现的一个简单可视化拖拽编辑器

ES Drager Editor

相关文章

可拖拽、缩放、旋转组件实现细节

网格效果及使用方法

辅助线和撤销回退

元素组合与拆分

菜单操作栏、json数据导入导出

⚡ 使用说明

安装依赖

npm i react-es-drager -D

组件中直接使用

import Drager from 'react-es-drager'
import React, { useState, useEffect  } from 'react'

type ComponentType = {
  id?: string
  component: string
  text?: string
  width?: number
  height?: number
  top?: number
  left?: number
  angle?: number
  style?: React.CSSProperties
}
interface EditorState {
  componentList: ComponentType[]
}

const BasicComponent = () => {
  const [comDatas, setComDatas] = useState<EditorState>({
    componentList: [
      {
        id: 'div1',
        component: 'div',
        text: 'div1',
        width: 100,
        height: 100,
        left: 0,
        top: 0
      },
      {
        id: 'div2',
        component: 'div',
        text: 'div2',
        width: 100,
        height: 100,
        top: 100,
        left: 100
      }
    ]
  })
  const onChange = (index: number, dragData: DragData) => {
  setComDatas((prevState) => ({
    componentList: prevState.componentList.map((item, i) =>
      i === index ? { ...item, ...dragData } : item
    )
  }))
  }
  return (
    <>
     <div className="es-editor">
        {comDatas.componentList.map((item, index) => (
          <Drager
            key={item.id}
            size={{
              width: item.width,
              height: item.height,
              left: item.left,
              top: item.top
            }}
            snap
            snapThreshold={10}
            markline
            onChange={(e: DragData) => onChange(index, e)}
          >
            <div>{item.text}</div>
          </Drager>
        ))}
    </>
  )
}

export default BasicComponent

Drager API

Drager 属性

属性名 说明 类型 默认
defaultSize 默认值 object {width: 100, height: 100, left: 0, top: 0, angle: 0 }
size 外部传入属性值 object(内部属性同上) -
color 颜色 ^[string] #3a7afe
resizable 是否可缩放 ^[boolean] true
rotatable 是否可旋转 ^[boolean] -
boundary 是否判断边界(最近定位父节点) ^[boolean] -
disabled 是否禁用 ^[boolean] -
minWidth 最小宽度 ^[number] 1
minHeight 最小高度 ^[number] 1
maxWidth 最大宽度 ^[number] 9999
maxHeight 最大高度 ^[number] 9999
selected 控制是否选中 ^[boolean] -
checkCollision 是否开启碰撞检测 ^[boolean] -
snapToGrid 开启网格 ^[boolean] -
gridX 网格X大小 ^[number] 50
gridY 网格Y大小 ^[number] 50
snap 开启吸附 ^[boolean] -
snapThreshold 吸附阈值 ^[number] 10
markline 辅助线([可自定义] ^[boolean]^[Function] -
scaleRatio 缩放比 ^[number] 1
disabledKeyEvent 禁用方向键移动 ^[boolean] -
border 是否显示边框 ^[boolean] true
aspectRatio 宽高缩放比 ^[number] -
equalProportion 宽高等比缩放(该属性和aspectRatio互斥,同时使用会存在问题) ^[boolean] -
resizeList 显示的缩放handle列表,top, bottom, left, right, top-left, top-right, bottom-left, bottom-right ^[string[]] -
guideline 吸附参考线 object {h:[],v:[]}

Drager 事件

事件名 说明 类型
onChange 位置、大小改变 ^[Function](dragData) => void
onDrag 拖拽中 ^[Function](dragData) => void
onDragStart 拖拽开始 ^[Function](dragData) => void
onDragEnd 拖拽结束 ^[Function](dragData) => void
onResize 缩放中 ^[Function](dragData) => void
onResizeStart 缩放开始 ^[Function](dragData) => void
onResizeEnd 缩放结束 ^[Function](dragData) => void
onRotate 旋转中 ^[Function](dragData) => void
onRotateStart 旋转开始 ^[Function](dragData) => void
onRotateEnd 旋转结束 ^[Function](dragData) => void
onFocus 获取焦点/选中 ^[Function](selected) => void
onBlur 失去焦点/非选中 ^[Function](selected) => void
  • dragData 类型
export type DragData = {
  width: number
  height: number
  left: number
  top: number
  angle: number
}

Drager 插槽

插槽名 说明
default 自定义默认内容
resize 缩放handle
rotate 旋转handle

引用

本工程属于经原创同意,vue转react项目, 引用自es-drager, 本项目将会长期更新, 欢迎issue和pr

About

A draggable, resizable, rotatable component based on react

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published