Skip to content

Commit 5f11568

Browse files
committed
docs: 改造自定义交互的文档
1 parent 0aa24d4 commit 5f11568

File tree

2 files changed

+129
-37
lines changed

2 files changed

+129
-37
lines changed

packages/site/common/manual/custom-extension/behavior/implement-behaviors.md

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
graph.addNodeData([
1313
{
1414
id: 'node-' + Date.now(),
15-
style: { x: layerX, y: layerY },
15+
style: { x: layerX, y: layerY, fill: options.fill },
1616
},
1717
]);
1818
graph.draw();
@@ -22,21 +22,46 @@
2222

2323
register(ExtensionCategory.BEHAVIOR, 'click-add-node', ClickAddNode);
2424

25-
const container = createContainer({ width: 300, height: 300 });
26-
container.style.border = '1px solid #ccc';
27-
28-
const graph = new Graph({
29-
container,
30-
width: 300,
31-
height: 300,
32-
data: {
33-
nodes: [],
25+
const wrapEl = await createGraph(
26+
{
27+
data: {
28+
nodes: [],
29+
},
30+
behaviors: [
31+
{
32+
type: 'click-add-node',
33+
key: 'click-add-node',
34+
fill: 'red',
35+
},
36+
],
3437
},
35-
behaviors: ['click-add-node'],
36-
});
38+
{ width: 600, height: 300 },
39+
(gui, graph) => {
40+
const options = {
41+
key: 'click-add-node',
42+
type: 'click-add-node',
43+
fill: 'red',
44+
};
45+
const optionFolder = gui.addFolder('ClickAddNode Options');
46+
optionFolder.add(options, 'fill', [
47+
'red',
48+
'black',
49+
'blue',
50+
'green',
51+
'yellow',
52+
'purple',
53+
]);
3754

38-
await graph.render();
55+
optionFolder.onChange(({ property, value }) => {
56+
graph.updateBehavior({
57+
key: 'click-add-node',
58+
[property]: value,
59+
});
60+
graph.render();
61+
});
62+
},
63+
);
3964

40-
return container;
65+
return wrapEl;
4166
})();
4267
```

packages/site/docs/manual/behavior/custom-behavior.zh.md

Lines changed: 90 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,57 +5,124 @@ order: 3
55

66
## 概述
77

8-
交互的执行逻辑通常为:1. 监听用户交互事件 2. 根据事件更新画布或执行其他操作。例如 `DragCanvas` 交互监听指针拖拽事件,根据拖拽的距离更新相机的位置
8+
自定义交互允许用户基于 G6 提供的完善的[事件机制](/api/event),把一个或多个相关的交互行为定义为一个完整的交互,以此实现符合业务场景的交互逻辑
99

10-
交互和插件的基类都是由 G6 内部的 `BaseExtension` 基类派生而来,因此交互和插件的实现方式基本相同,但基于可视化的概念区分,交互通常用于处理用户交互事件,而插件通常用于处理画布的渲染逻辑、额外组件渲染等。
10+
### 交互的执行逻辑
11+
12+
通常为:
13+
14+
1. 监听用户交互事件
15+
16+
2. 根据事件更新画布或执行其他操作
17+
18+
例如 `DragCanvas` 交互监听指针拖拽事件,根据拖拽的距离更新相机的位置。
19+
20+
### 交互与插件的区别
21+
22+
- 交互和插件的基类都是由 G6 内部的 [BaseExtension](https://github.com/antvis/G6/blob/v5/packages/g6/src/registry/extension/index.ts) 基类派生而来,因此交互和插件的实现方式基本相同
23+
- 但基于可视化的概念区分,交互通常用于处理用户交互事件,而插件通常用于处理画布的渲染逻辑、额外组件渲染等
24+
25+
:::info{title=提示}
26+
因概念上的区分,交互实例不可获取,插件实例可获取( [getPluginInstance](/api/plugin#graphgetplugininstancekey)
27+
:::
28+
29+
## 什么时候需要自定义交互?
30+
31+
- `目的`:当用户在实现符合业务场景的交互逻辑时,我们通常需要配合 G6 的事件系统,对相关事件作出响应,执行需要的交互逻辑。
32+
- `不使用自定义交互`:如果不使用自定义交互,用户需要在创建 Graph 实例后,通过 `graph.on` 进行一系列的事件监听和响应处理,代码逻辑处理和编排会显得异常艰难。
33+
- `交互的优势`:每个交互行为都是独立的代码模块,交互系统的存在方便用户解耦业务逻辑、避免代码臃肿以及方便用户后续维护等。
34+
- `结论`
35+
> 1、当用户需要实现任何交互逻辑时,应当首先考虑自定义交互。
36+
>
37+
> 2、当内置交互无法完全满足业务需求时,用户也可以通过自定义交互(继承内置交互)进行调整和修改。
38+
>
39+
> *(如果需要内置交互支持的特性是较通用的,或者内置交互存在 Bug ,这种时候欢迎大家到 [Github](https://github.com/antvis/G6) 提 Issue 或者 PR )*
1140
1241
## 实现交互
1342

1443
一个交互的实现相当灵活,你可以以你喜欢的风格实现你的交互。
1544

16-
下面是一个简单的自定义交互实现,当用户点击画布时,会在画布上添加一个节点:
45+
下面是一个简单的自定义交互实现,当用户点击画布时,会在画布上添加一个节点(可通过交互配置定义所添加节点的填充颜色)
1746

1847
```typescript
19-
import { BaseBehavior, CanvasEvent } from '@antv/g6';
2048
import type { BaseBehaviorOptions, RuntimeContext, IPointerEvent } from '@antv/g6';
49+
import { BaseBehavior, CanvasEvent } from '@antv/g6';
2150

22-
interface ClickAddNodeOptions extends BaseBehaviorOptions {}
51+
interface ClickAddNodeOptions extends BaseBehaviorOptions {
52+
fill: string;
53+
}
2354

24-
class ClickAddNode extends BaseBehavior<ClickAddNodeOptions> {
55+
export class ClickAddNode extends BaseBehavior<ClickAddNodeOptions> {
56+
static defaultOptions: Partial<ClickAddNodeOptions> = {
57+
fill: 'red',
58+
};
2559
constructor(context: RuntimeContext, options: ClickAddNodeOptions) {
26-
super(context, options);
27-
60+
super(context, Object.assign({}, ClickAddNode.defaultOptions, options));
61+
this.bindEvents();
62+
}
63+
private bindEvents() {
64+
const { graph } = this.context;
65+
graph.on(CanvasEvent.CLICK, this.addNode);
66+
}
67+
private addNode = (event: IPointerEvent) => {
2868
const { graph } = this.context;
29-
graph.on(CanvasEvent.CLICK, (event: IPointerEvent) => {
30-
const { layerX, layerY } = event.nativeEvent as PointerEvent;
31-
graph.addNodeData([
32-
{
33-
id: 'node-' + Date.now(),
34-
style: { x: layerX, y: layerY },
35-
},
36-
]);
37-
graph.draw();
38-
});
69+
const { layerX, layerY } = event.nativeEvent as PointerEvent;
70+
graph.addNodeData([
71+
{
72+
id: 'node-' + Date.now(),
73+
style: { x: layerX, y: layerY, fill: this.options.fill },
74+
},
75+
]);
76+
graph.draw();
77+
}
78+
private unbindEvents() {
79+
const { graph } = this.context;
80+
graph.off(CanvasEvent.CLICK, this.addNode);
81+
}
82+
public destroy() {
83+
// 销毁时解绑事件
84+
this.unbindEvents();
85+
super.destroy();
3986
}
4087
}
4188
```
4289

43-
在示例代码中,我们基于 `BaseBehavior` 实现了一个 `ClickAddNode` 交互,该交互在构造函数中添加了 Graph 的事件监听,当用户点击画布时,会在点击位置添加一个节点。
90+
- 在示例代码中,我们实现了一个 `ClickAddNode` 交互,该交互在构造函数中添加了 Graph 的事件监听,当用户点击画布时,会在点击位置添加一个节点,并且支持配置所添加节点的填充颜色。
91+
- `BaseBehavior` 是所有交互的基类,每个自定义交互都需要继承这个基类实现。
4492

45-
> 点击下面画布中的空白位置以添加一个节点
93+
> 点击下面画布中的空白位置以添加一个节点,可切换右侧面板配置节点颜色
4694
4795
<embed src="@/common/manual/custom-extension/behavior/implement-behaviors.md"></embed>
4896

4997
:::info{title=提示}
50-
上述示例是一个最简单的交互实现,实际开发过程中,你还需要处理监听事件的销毁、交互的启用与禁用等逻辑
98+
上述示例是一个最简单的交互实现,实际开发过程中,你可能还需要处理交互的启用与禁用等逻辑
5199

52100
此外,多个交互之间可能会有事件冲突,你需要小心处理这些冲突。
53101
:::
54102

55103
## 注册交互
56104

57-
通过 G6 提供的 register 方法注册即可,详见[注册交互](/manual/behavior/overview#注册交互)
105+
通过 G6 提供的 register 方法注册即可
106+
107+
```typescript
108+
import { ExtensionCategory, register } from '@antv/g6';
109+
import { ClickAddNode } from 'your-custom-behavior-path';
110+
111+
register(ExtensionCategory.BEHAVIOR, 'click-add-node', ClickAddNode);
112+
```
58113

59114
## 配置交互
60115

61-
可在 `behaviors` 中传入交互类型名称或配置参数对象,详见[配置交互](/manual/behavior/overview#配置交互)
116+
可在 `behaviors` 中传入交互类型名称或配置参数对象,比如上面的 ClickAddNode ,详见[配置交互](/manual/behavior/overview#配置和使用)
117+
118+
```typescript
119+
const graph = new Graph({
120+
// 其他配置
121+
behaviors: [
122+
{
123+
type: 'click-add-node',
124+
fill: 'blue',
125+
},
126+
],
127+
});
128+
```

0 commit comments

Comments
 (0)