Skip to content

Commit 6ab8070

Browse files
committed
doc: 改造自定义交互的文档
1 parent 0aa24d4 commit 6ab8070

File tree

2 files changed

+124
-36
lines changed

2 files changed

+124
-36
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: 85 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,57 +5,120 @@ order: 3
55

66
## 概述
77

8-
交互的执行逻辑通常为:1. 监听用户交互事件 2. 根据事件更新画布或执行其他操作。例如 `DragCanvas` 交互监听指针拖拽事件,根据拖拽的距离更新相机的位置。
8+
自定义交互允许用户基于 G6 提供的完善的事件机制,把一个或多个相关的交互行为定义为一个完整的交互,以此实现符合业务场景的交互逻辑
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/)
27+
:::
28+
29+
## 什么时候需要自定义交互?
30+
31+
- `目的`:当用户在实现符合业务场景的交互逻辑时,我们通常需要配合 G6 的事件系统,对相关事件作出响应,执行需要的交互逻辑。
32+
- `不使用自定义交互`:如果不使用自定义交互,用户需要在创建 Graph 实例后,通过 `graph.on` 进行一系列的事件监听和响应处理,代码逻辑处理和编排会显得异常艰难。
33+
- `交互的优势`:每个交互行为都是独立的代码模块,交互系统的存在方便用户解耦业务逻辑、避免代码臃肿以及方便用户后续维护等。
34+
35+
- `结论`:当用户需要实现任何交互逻辑时,应当首先考虑自定义交互。
1136

1237
## 实现交互
1338

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

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

1843
```typescript
1944
import { BaseBehavior, CanvasEvent } from '@antv/g6';
2045
import type { BaseBehaviorOptions, RuntimeContext, IPointerEvent } from '@antv/g6';
2146

22-
interface ClickAddNodeOptions extends BaseBehaviorOptions {}
47+
interface ClickAddNodeOptions extends BaseBehaviorOptions {
48+
fill: string;
49+
}
2350

24-
class ClickAddNode extends BaseBehavior<ClickAddNodeOptions> {
51+
export class ClickAddNode extends BaseBehavior<ClickAddNodeOptions> {
52+
static defaultOptions: Partial<ClickAddNodeOptions> = {
53+
fill: 'red',
54+
};
2555
constructor(context: RuntimeContext, options: ClickAddNodeOptions) {
26-
super(context, options);
27-
56+
super(context, Object.assign({}, ClickAddNode.defaultOptions, options));
57+
this.bindEvents();
58+
}
59+
bindEvents() {
60+
const { graph } = this.context;
61+
graph.on(CanvasEvent.CLICK, this.addNode);
62+
}
63+
addNode(event: IPointerEvent) {
2864
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-
});
65+
const { layerX, layerY } = event.nativeEvent as PointerEvent;
66+
graph.addNodeData([
67+
{
68+
id: 'node-' + Date.now(),
69+
style: { x: layerX, y: layerY, fill: this.options.fill },
70+
},
71+
]);
72+
graph.draw();
73+
}
74+
unbindEvents() {
75+
const { graph } = this.context;
76+
graph.off(CanvasEvent.CLICK, this.addNode);
77+
}
78+
destroy() {
79+
// 销毁时解绑事件
80+
this.unbindEvents();
81+
super.destroy();
3982
}
4083
}
4184
```
4285

43-
在示例代码中,我们基于 `BaseBehavior` 实现了一个 `ClickAddNode` 交互,该交互在构造函数中添加了 Graph 的事件监听,当用户点击画布时,会在点击位置添加一个节点。
86+
在示例代码中,我们基于 `BaseBehavior` 实现了一个 `ClickAddNode` 交互,该交互在构造函数中添加了 Graph 的事件监听,当用户点击画布时,会在点击位置添加一个节点,并且支持配置所添加节点的填充颜色
4487

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

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

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

5598
## 注册交互
5699

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

59109
## 配置交互
60110

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

0 commit comments

Comments
 (0)