---
title: 点击选中 ClickSelect
order: 3
---
## 概述
当鼠标点击元素时,会使元素高亮。
## 使用场景
这一交互主要用于:
- 聚焦元素
- 查看元素详情
- 查看元素关系
## 在线体验
## 基本用法
在图配置中添加这一交互:
**1. 快速配置(静态)**
使用字符串形式直接声明,这种方式简洁但仅支持默认配置,且配置后不可动态修改:
```javascript
const graph = new Graph({
// 其他配置...
behaviors: ['click-select'],
});
```
**2. 对象配置(推荐)**
使用对象形式进行配置,支持自定义参数,且可以在运行时动态更新配置:
```javascript
const graph = new Graph({
// 其他配置...
behaviors: [
{
type: 'click-select',
key: 'click-select-1',
degree: 2, // 选中扩散范围
state: 'active', // 选中的状态
neighborState: 'neighborActive', // 相邻节点附着状态
unselectedState: 'inactive', // 未选中节点状态
},
],
});
```
## 配置项
| 配置项 | 说明 | 类型 | 默认值 | 必选 |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | -------------- | ---- |
| type | 交互类型名称。此交互已内置,你可以通过 `type: 'click-select'` 来使用它。 | `click-select` \| string | `click-select` | ✓ |
| animation | 是否在元素状态切换时启用动画效果 | boolean | true | |
| degree | 控制了高亮扩散范围,[示例](#degree) | number \| (event:[Event](/api/event#事件对象属性)) => number | 0 | |
| enable | 是否启用点击元素的功能,支持通过函数的方式动态控制是否启用,[示例](#enable) | boolean \| ((event: [Event](/api/event#事件对象属性)) => boolean) | true | |
| multiple | 是否允许多选 | boolean | false | |
| state | 当元素被选中时应用的状态 | string \| `selected` \| `active`\| `inactive`\| `disabled`\| `highlight` | `selected` | |
| neighborState | 当有元素选中时,其相邻 n 度关系的元素应用的状态。n 的值由属性 degree 控制,例如 degree 为 1 时表示直接相邻的元素,[示例](#neighborstate) | string \| `selected` \| `active`\| `inactive`\| `disabled`\| `highlight` | `selected` | |
| unselectedState | 当有元素被选中时,除了选中元素及其受影响的邻居元素外,其他所有元素应用的状态,[示例](#unselectedState) | string \| `selected` \| `active`\| `inactive`\| `disabled`\| `highlight` | | |
| onClick | 点击元素时的回调 | (event: [Event](/api/event#事件对象属性)) => void | | |
| trigger | 按下该快捷键配合鼠标点击进行多选,按键参考: _MDN Key Values_ | string[] \| (`Control` \| `Shift`\| `Alt` \| `......`)[] | `['shift']` | |
### degree
控制了高亮扩散范围
- 对于节点来说,`0` 表示只选中当前节点,`1` 表示选中当前节点及其直接相邻的节点和边,以此类推。
- 对于边来说,`0` 表示只选中当前边,`1` 表示选中当前边及其直接相邻的节点,以此类推。
> 如下示例,当 `degree: 0` 仅高亮红色点;
> 当 `degree: 1` 高亮红色和橙色点。
### enable
是否启用点击元素的功能
可以通过函数的方式动态控制是否启用,例如只有节点被选中时才启用。
```js
{
//⚠️ 注意,这里需要同时设置节点和画布,否则用户点击画布时将不会监听到事件
enable: (event) => ['node', 'canvas'].includes(event.targetType);
}
```
```js | ob { pin: false, inject: true }
import { Graph } from '@antv/g6';
const graph = new Graph({
container: 'container',
width: 400,
height: 200,
data: {
nodes: [
{ id: 'node1', style: { x: 100, y: 60 } },
{ id: 'node2', style: { x: 200, y: 60 } },
{ id: 'node3', style: { x: 300, y: 60 } },
],
edges: [
{ source: 'node1', target: 'node2' },
{ source: 'node2', target: 'node3' },
],
},
node: {
style: {
fill: '#E4504D',
},
state: {
active: {
fill: '#0f0',
},
neighborActive: {
fill: '#FFC40C',
},
},
},
behaviors: [
{
type: 'click-select',
degree: 1,
state: 'active',
neighborState: 'neighborActive',
enable: (event) => ['node', 'canvas'].includes(event.targetType),
},
],
});
graph.render();
```
同理,如果只希望边能被选中:
```js
{
enable: (event) => ['edge', 'canvas'].includes(event.targetType);
}
```
### neighborState
当有元素选中时,其相邻 n 度关系的元素应用的状态。n 的值由属性 degree 控制,例如 degree 为 1 时表示直接相邻的元素
```js
const graph = new Graph({
behaviors: [
{
type: 'click-select',
degree: 1,
// 被直接点击的节点附着的状态
state: 'active',
// 相邻的节点附着的状态
neighborState: 'neighborActive',
},
],
});
```
```js | ob { pin: false, inject: true }
import { Graph } from '@antv/g6';
const graph = new Graph({
container: 'container',
width: 400,
height: 200,
layout: {
type: 'grid',
},
data: {
nodes: [{ id: 'node1' }, { id: 'node2' }, { id: 'node3' }, { id: 'node4' }, { id: 'node5' }],
edges: [
{ source: 'node1', target: 'node2' },
{ source: 'node2', target: 'node3' },
{ source: 'node3', target: 'node4' },
{ source: 'node4', target: 'node5' },
],
},
node: {
style: {
fill: '#E4504D',
},
state: {
active: {
fill: '#0f0',
},
neighborActive: {
fill: '#FFC40C',
halo: true,
},
},
},
behaviors: [
{
type: 'click-select',
degree: 1,
state: 'active',
neighborState: 'neighborActive',
},
],
});
graph.render();
```
### unselectedState
当有元素被选中时,除了被选中元素和扩散的邻居元素外,其他所有元素应用的状态。
内置状态: `selected` `active` `inactive` `disabled` `highlight`
```js
const graph = new Graph({
behaviors: [
{
type: 'click-select',
degree: 1,
unselectedState: 'inactive',
},
],
});
```
```js | ob { pin: false, inject: true }
import { Graph } from '@antv/g6';
const graph = new Graph({
container: 'container',
width: 400,
height: 200,
layout: {
type: 'grid',
},
data: {
nodes: [{ id: 'node1' }, { id: 'node2' }, { id: 'node3' }, { id: 'node4' }, { id: 'node5' }],
edges: [
{ source: 'node1', target: 'node2' },
{ source: 'node2', target: 'node3' },
{ source: 'node3', target: 'node4' },
{ source: 'node4', target: 'node5' },
],
},
node: {
style: {
fill: '#E4504D',
},
state: {
active: {
fill: '#0f0',
},
neighborActive: {
fill: '#FFC40C',
},
},
},
behaviors: [
{
type: 'click-select',
degree: 1,
state: 'active',
neighborState: 'neighborActive',
unselectedState: 'inactive',
},
],
});
graph.render();
```
## 示例
### 点击选中节点及其直接相连的节点
**点击节点** 会从 默认状态 切换为 active
**相邻节点** 会从 默认状态 切换为 neighborActive
```js
const graph = new Graph({
node: {
style: {
fill: '#E4504D',
},
state: {
// 选中节点状态
active: {
fill: '#0f0',
},
// 相邻节点状态
neighborActive: {
fill: '#FFC40C',
},
},
},
behaviors: [
{
type: 'click-select',
degree: 1,
state: 'active',
// 相邻节点附着状态
neighborState: 'neighborActive',
// 未选中节点状态
unselectedState: 'inactive',
},
],
});
```
```js | ob { pin: false, inject: true }
import { Graph } from '@antv/g6';
const graph = new Graph({
container: 'container',
width: 400,
height: 200,
layout: {
type: 'grid',
},
data: {
nodes: [{ id: 'node1' }, { id: 'node2' }, { id: 'node3' }, { id: 'node4' }, { id: 'node5' }],
edges: [
{ source: 'node1', target: 'node2' },
{ source: 'node2', target: 'node3' },
{ source: 'node3', target: 'node4' },
{ source: 'node4', target: 'node5' },
],
},
node: {
style: {
fill: '#E4504D',
},
state: {
active: {
fill: '#0f0',
},
neighborActive: {
fill: '#FFC40C',
},
},
},
behaviors: [
{
type: 'click-select',
degree: 1,
state: 'active',
neighborState: 'neighborActive',
unselectedState: 'inactive',
},
],
});
graph.render();
```
### 实际案例
```js | ob { inject: true }
import { Graph } from '@antv/g6';
const graph = new Graph({
container: 'container',
layout: {
type: 'grid',
},
data: {
nodes: [{ id: 'node1' }, { id: 'node2' }, { id: 'node3' }, { id: 'node4' }, { id: 'node5' }],
edges: [
{ source: 'node1', target: 'node2' },
{ source: 'node2', target: 'node3' },
{ source: 'node3', target: 'node4' },
{ source: 'node4', target: 'node5' },
],
},
node: {
style: {
fill: '#E4504D',
},
state: {
active: {
fill: '#0b0',
},
},
},
behaviors: [
{
type: 'click-select',
degree: 1,
state: 'active',
unselectedState: 'inactive',
multiple: true,
trigger: ['shift'],
},
'drag-element',
],
});
graph.render();
```