diff --git a/hooks/useDrag/docs/demo/demo1.tsx b/hooks/useDrag/docs/demo/demo1.tsx
new file mode 100644
index 00000000..05b56a47
--- /dev/null
+++ b/hooks/useDrag/docs/demo/demo1.tsx
@@ -0,0 +1,87 @@
+/**
+ * title: Basic usage
+ * desc: The drop area can accept files, uri, text or one of the boxes below.
+ *
+ * title.zh-CN: 基础用法
+ * desc.zh-CN: 拖拽区域可以接受文件,链接,文字,和下方的 box 节点。
+ */
+
+import React, { useRef, useState } from "react";
+import { useDrag } from "../../src";
+import { useDrop } from "../../../useDrop/src";
+const DragItem = ({ data }) => {
+ const dragRef = useRef(null);
+
+ const [dragging, setDragging] = useState(false);
+
+ useDrag(data, dragRef, {
+ onDragStart: () => {
+ setDragging(true);
+ },
+ onDragEnd: () => {
+ setDragging(false);
+ },
+ });
+
+ return (
+
+ {dragging ? "dragging" : `box-${data}`}
+
+ );
+};
+
+export default () => {
+ const [isHovering, setIsHovering] = useState(false);
+
+ const dropRef = useRef(null);
+
+ useDrop(dropRef, {
+ onText: (text, e) => {
+ console.log(e);
+ alert(`'text: ${text}' dropped`);
+ },
+ onFiles: (files, e) => {
+ console.log(e, files);
+ alert(`${files.length} file dropped`);
+ },
+ onUri: (uri, e) => {
+ console.log(e);
+ alert(`uri: ${uri} dropped`);
+ },
+ onDom: (content: string, e) => {
+ alert(`custom: ${content} dropped`);
+ },
+ onDragEnter: () => setIsHovering(true),
+ onDragLeave: () => setIsHovering(false),
+ });
+
+ return (
+
+
+ {isHovering ? "release here" : "drop here"}
+
+
+
+ {["1", "2", "3", "4", "5"].map((e) => (
+
+ ))}
+
+
+ );
+};
diff --git a/hooks/useDrag/docs/demo/demo2.tsx b/hooks/useDrag/docs/demo/demo2.tsx
new file mode 100644
index 00000000..cc09fd7b
--- /dev/null
+++ b/hooks/useDrag/docs/demo/demo2.tsx
@@ -0,0 +1,36 @@
+/**
+ * title: Customize Image
+ * desc: Customize image that follow the mouse pointer during dragging.
+ *
+ * title.zh-CN: 自定义拖拽图像
+ * desc.zh-CN: 自定义拖拽过程中跟随鼠标指针的图像。
+ */
+
+import React, { useRef } from "react";
+import { useDrag } from "../../src";
+
+const COMMON_STYLE: React.CSSProperties = {
+ border: "1px solid #e8e8e8",
+ height: "50px",
+ lineHeight: "50px",
+ padding: "16px",
+ textAlign: "center",
+ marginRight: "16px",
+};
+
+export default () => {
+ const dragRef = useRef(null);
+
+ useDrag("", dragRef, {
+ dragImage: {
+ image: "/logo.svg",
+ },
+ });
+
+ return (
+
+
+
drag me
+
+ );
+};
diff --git a/hooks/useDrag/docs/useDrag.md b/hooks/useDrag/docs/useDrag.md
new file mode 100644
index 00000000..c8c04ffd
--- /dev/null
+++ b/hooks/useDrag/docs/useDrag.md
@@ -0,0 +1,93 @@
+---
+title: useDrop & useDrag
+group:
+title: Dom
+order: 70
+
+---
+
+# useDrop & useDrag
+
+处理元素拖拽的 Hook。
+
+> useDrop 可以单独使用来接收文件、文字和网址的拖拽。
+>
+> useDrag 允许一个 DOM 节点被拖拽,需要配合 useDrop 使用。
+>
+> 向节点内触发粘贴动作也会被视为拖拽。
+
+## 代码演示
+
+### 基础用法
+
+
+
+### 自定义拖拽图像
+
+
+
+## API
+
+### useDrag
+
+```typescript
+useDrag(
+ data: any,
+ target: (() => Element) | Element | MutableRefObject,
+ options?: DragOptions
+);
+```
+
+#### Params
+
+| 参数 | 说明 | 类型 | 默认值 |
+| ------- | --------------------- | ----------------------------------------------------------- | ------ |
+| data | 拖拽的内容 | `any` | - |
+| target | DOM 节点或者 Ref 对象 | `() => Element` \| `Element` \| `MutableRefObject` | - |
+| options | 额外的配置项 | `DragOptions` | - |
+
+#### DragOptions
+
+| 参数 | 说明 | 类型 | 默认值 |
+| ----------- | ---------------------------------- | ------------------------------ | ------ |
+| onDragStart | 开始拖拽的回调 | `(e: React.DragEvent) => void` | - |
+| onDragEnd | 结束拖拽的回调 | `(e: React.DragEvent) => void` | - |
+| dragImage | 自定义拖拽过程中跟随鼠标指针的图像 | `DragImageOptions` | - |
+
+#### DragImageOptions
+
+| 参数 | 说明 | 类型 | 默认值 |
+| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------- | ------ |
+| image | 拖拽过程中跟随鼠标指针的图像。图像通常是一个 [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) 元素,但也可以是 [`