react-es-drager
Version:
A draggable, resizable, rotatable component based on react
195 lines (155 loc) • 6.45 kB
Markdown
# Rect Es Drager 拖拽组件
<p align="middle" ><img width="100" src="https://kakajun.github.io/react-es-drager/logo/logo.png"/></p>
<table width="100%" align="center">
<tr>
<th colspan="4">Rect Es Drager</th>
</tr>
<tr>
<td align="center"><a href="https://kakajun.github.io/react-es-drager/"><strong>Draggable</strong></a></td>
<td align="center"><a href="https://kakajun.github.io/react-es-drager/"><strong>Resizable</strong></a></td>
<td align="center"><a href="https://kakajun.github.io/react-es-drager/"><strong>Rotatable</strong></a></td>
</tr>
<tr>
<td align="center">
<img src="https://kakajun.github.io/react-es-drager//static/draggable.gif" />
</td>
<td align="center">
<img src="https://kakajun.github.io/react-es-drager//static/resizable.gif" />
</td>
<td align="center">
<img src="https://kakajun.github.io/react-es-drager//static/rotatable.gif" />
</td>
</tr>
</table>
## 🌈介绍
基于 react18 + typescript + vite 的可拖拽、缩放、旋转的组件
- 拖拽&区域拖拽
- 支持缩放
- 旋转
- 网格拖拽缩放
- 拖拽编辑器
### 运行项目
```sh
# 拉取项目
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](https://kakajun.github.io/react-es-drager//#/editor)
### 相关文章
[可拖拽、缩放、旋转组件实现细节](https://juejin.cn/post/7225152932675993655)
[网格效果及使用方法](https://juejin.cn/post/7239895206081806373)
[辅助线和撤销回退](https://juejin.cn/post/7254812719349383225)
[元素组合与拆分](https://juejin.cn/post/7258337246024843319)
[菜单操作栏、json数据导入导出](https://juejin.cn/post/7269603447673880636)
## ⚡ 使用说明
### 安装依赖
```
npm i react-es-drager -D
```
### 组件中直接使用
```jsx
import Drager from 'react-es-drager'
const dragList = []
const BasicComponent = () => {
return (
<>
{dragList.map((list, index) =>
list.map((item, index2) => (
<Drager
key={`${index}-${index2}`}
width={100}
height={100}
left={index2 * 150 + 30}
top={index * 150 + 30}
{...item}
style={{ color: item.color }}
>
{item.text}
</Drager>
))
)}
</>
)
}
export default BasicComponent
```
## Drager API
### Drager 属性
| 属性名 | 说明 | 类型 | 默认 |
| --- | --- | --- | --- |
| tag | component组件的标签属性 | ^[string] | div |
| type | 类型,`rect`, `text`, `image` | ^[string] | rect |
| 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 | 辅助线[可自定义](demo markline) | ^[boolean]^[Function] | - |
| extraLines | 添加除了es-drager元素以外的对齐线,例如添加中心点对齐([可参考](demo markline)) | ^[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[]] | - |
### 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 类型
```javascript
export type DragData = {
width: number
height: number
left: number
top: number
angle: number
}
```
### Drager 插槽
| 插槽名 | 说明 |
| ------- | -------------- |
| default | 自定义默认内容 |
| resize | 缩放handle |
| rotate | 旋转handle |
### 引用
本工程属于经原创同意,vue转react项目, 引用自[es-drager](https://github.com/vangleer/es-drager), 本项目将会长期更新, 欢迎issue和pr