---
mobile: false
nav:
  title: forcegraph
  path: /forcegraph
---

## ForceGraph

普通实践:

```tsx
import React from 'react';
import ForceGraph from '@kgdata/forcegraph';
const graphData = {
  nodes: [
    { id: 'node0', size: 50, label: 'node0' },
    { id: 'node1', size: 30, label: 'node1' },
    { id: 'node2', size: 30, label: 'node2' },
    { id: 'node3', size: 30, label: 'node3' },
  ],
  edges: [
    { source: 'node0', target: 'node1', label: '我是连线' },

    { source: 'node0', target: 'node2' },
    { source: 'node0', target: 'node3' },
    // { source: 'node0', target: 'node17' },
  ],
};

export default () => {
  return (
    <div style={{ height: 600 }}>
      <ForceGraph {...{ graphData }} />
    </div>
  );
};
```

添加关系:

```tsx
import React, { useState } from 'react';
import ForceGraph from '@kgdata/forcegraph';
function getData(num: number, name: string, start: string) {
  let data: any = {
    nodes: [],
    edges: [],
  };
  for (let i = 0; i < num; i++) {
    data.nodes.push({
      id: `${name}${i}`,
      size: 20,
      label: `${name}${i}`,
    });
    if (i > 0) {
      data.edges.push({ source: `${start}`, target: `${name}${i}` });
    }
  }
  return data;
}
const App = () => {
  const [graphData, setGraphData] = useState(getData(100, 'node', 'node0'));

  const onNodeClick = async (e: any, Graph: any) => {
    let addGraphData = getData(100, 'newnode', e.item._cfg.id);
    let newGraphData = Object.assign(graphData, {});
    newGraphData.edges.some((item: any) => {
      if (item.target === e.item._cfg.id) {
        item.linkHeight = 300;
        return true;
      }
    });
    setGraphData({
      nodes: [...newGraphData.nodes, ...addGraphData.nodes],
      edges: [...newGraphData.edges, ...addGraphData.edges],
    });
  };

  return (
    <div style={{ height: 600 }}>
      <ForceGraph {...{ graphData, onNodeClick }} />{' '}
    </div>
  );
};

export default App;
```

request:

```tsx
import React, { useState } from 'react';
import ForceGraph from '@kgdata/forcegraph';
function getData(num: number, name: string, start: string) {
  let data: any = {
    nodes: [],
    edges: [],
  };
  for (let i = 0; i < num; i++) {
    data.nodes.push({
      id: `${name}${i}`,
      size: 20,
      label: `${name}${i}`,
    });
    if (i > 0) {
      data.edges.push({ source: `${start}`, target: `${name}${i}` });
    }
  }
  return data;
}
const App = () => {
  const [graphData, setGraphData] = useState(getData(100, 'node', 'node0'));

  const onNodeClick = async (e: any, Graph: any) => {};

  const myQuery = async () => {
    return {
      data: graphData,
    };
  };
  const request = async (params) => {
    const msg = await myQuery(params);
    return {
      data: msg.data,
    };
  };
  return (
    <div style={{ height: 600 }}>
      <ForceGraph {...{ params: { nodeId: '1' }, request, onNodeClick }} />{' '}
    </div>
  );
};

export default App;
```

### 需要传入 props

| 名称        | 是否必传 | 类型     | 备注                                |
| ----------- | -------- | -------- | ----------------------------------- |
| `graphData` | `false`  | `String` | 力导向图的数据源                    |
| `graphCfg`  | `false`  | `Object` | 力导向图的配置项                    |
| `params`    | `false`  | `Object` | 配合`request`                       |
| `request`   | `false`  | `Fn`     | 需要返回`promise`结果，力导向图数据 |
| `postData`  | `false`  | `Fn`     | 处理`requset`返回的 data 结果       |
| `on...`     | `false`  | `Fn`     | 力导向图事件                        |

注意：该力导向图数据来源 `graphData`和`request`选择其中一个进行使用,同时使用`request`优先级高

#### `graphData`(必传)

该力导向图的数据源。例如:`{nodes:[],edges:[]}`

    #####  `graphData.nodes`

`nodes`节点信息 例如:`[{id:'node0',label:'我是第一个节点'}]`

|    名称    | 是否必传 |   类型   |       备注       |
| :--------: | :------: | :------: | :--------------: |
|    `id`    |  `true`  | `String` | 该节点的唯一 id  |
|  `label`   | `false`  | `String` |   该节点的名称   |
|   `size`   | `false`  | `Number` |    该节点大小    |
|  `style`   | `false`  | `object` | 该节点的样式属性 |
| `labelCfg` | `false`  | `object` |   名称文本配置   |

##### `nodes.style`

`style`配置项

|   名称   | 是否必传 |   类型   |       备注       |
| :------: | :------: | :------: | :--------------: |
|  `fill`  | `false`  | `String` | 该节点的填充颜色 |
| `stroke` | `false`  | `String` |  该节点描边颜色  |

##### `nodes.labelCfg`

|  名称   | 是否必传 |   类型   |      备注      |
| :-----: | :------: | :------: | :------------: |
| `style` | `false`  | `Object` | 该文本样式属性 |

##### `nodes.lebelCfg.style`

|    名称    | 是否必传 |   类型   |   备注   |
| :--------: | :------: | :------: | :------: |
|   `fill`   | `false`  | `String` | 文本颜色 |
| `fontSize` | `false`  | `Number` | 文本大小 |

##### `graphData.edges`

​ `edges` : 节点关系(连线) 例如:`[{ source: 'node0', target: 'node1',label:'我的连线'}]`

|    名称    | 是否必传 |   类型   |      备注      |
| :--------: | :------: | :------: | :------------: |
|  `source`  |  `true`  | `String` |    来源 id     |
|  `target`  |  `true`  | `String` |    结束 id     |
|  `label`   | `false`  | `String` |    连线名称    |
|  `style`   | `false`  | `Object` | 该边的样式属性 |
| `labelCfg` | `false`  | `Object` |  名称文本配置  |

##### `edges.style`

|    名称     | 是否必传 |   类型   |    备注    |
| :---------: | :------: | :------: | :--------: |
|  `stroke`   | `false`  | `String` |  该边颜色  |
| `lineWidth` | `false`  | `Number` | 该边的宽度 |

##### `edges.labelCfg`

|    名称    | 是否必传 |   类型   |   备注   |
| :--------: | :------: | :------: | :------: |
|   `fill`   | `false`  | `String` | 文本颜色 |
| `fontSize` | `false`  | `Number` | 文本大小 |

#### `graphCfg`

该力导向图的配置。例如：`{ width: 600,height: 600,defaultNode:{label:'默认名称'},defaultEdge:{label:'默认名称'}}`

|     名称      | 是否必传 |   类型   |                         备注                          |
| :-----------: | :------: | :------: | :---------------------------------------------------: |
|    `width`    |  `true`  | `Number` |                    该力导向图宽度                     |
|   `height`    |  `true`  | `Number` |                    该力导向图高度                     |
| `defaultNode` | `false`  | `Object` | 默认节点配置(这是全局配置，同上方 nodes 单个配置相同) |
| `defaultEdge` | `false`  | `Object` |  默认边配置(这是全局配置，同上方 edges 单个配置相同)  |
|   `layout`    | `false`  | `Object` |                     力导向图布局                      |

##### `graphCfg.layout`

| 名称           | 是否必传 | 类型          | 备注                         |
| -------------- | -------- | ------------- | ---------------------------- |
| `linkDistance` | `false`  | `Number`/`Fn` | 该力导向图边的长度           |
| `center`       | `false`  | `Number[]`    | 该力导向图的中心（[ 0, 0 ]） |

#### requset

最佳

#### 事件

| 事件             | 描述               | 回调参数     |
| ---------------- | ------------------ | ------------ |
| `onNodeClick`    | 节点`node`单击事件 | `e`，`Graph` |
| `onNodeDblClick` | 节点`node`双击事件 | `e`,`Graph`  |

回调参数

| 参数    | 描述                                         |
| ------- | -------------------------------------------- |
| `e`     | 默认事件参数，`e.item`为触发元素             |
| `Graph` | 该力导向图实例 可操作一些元素的添加,删除修改 |
