
基于 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数据导入导出
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
属性名 |
说明 |
类型 |
默认 |
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:[]} |
事件名 |
说明 |
类型 |
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 |
export type DragData = {
width: number
height: number
left: number
top: number
angle: number
}
插槽名 |
说明 |
default |
自定义默认内容 |
resize |
缩放handle |
rotate |
旋转handle |
本工程属于经原创同意,vue转react项目, 引用自es-drager, 本项目将会长期更新, 欢迎issue和pr