|
import { Graph } from '@antv/g6'; |
|
import { useSize } from 'ahooks'; |
|
import { useEffect, useRef } from 'react'; |
|
import { graphData } from './constant'; |
|
|
|
import styles from './index.less'; |
|
import { Converter } from './util'; |
|
|
|
const converter = new Converter(); |
|
|
|
const nextData = converter.buildNodesAndCombos( |
|
graphData.nodes, |
|
graphData.edges, |
|
); |
|
console.log('π ~ nextData:', nextData); |
|
|
|
const finalData = { ...graphData, ...nextData }; |
|
|
|
const ForceGraph = () => { |
|
const containerRef = useRef<HTMLDivElement>(null); |
|
const size = useSize(containerRef); |
|
let graph: Graph; |
|
|
|
const render = () => { |
|
graph = new Graph({ |
|
container: containerRef.current!, |
|
autoFit: 'view', |
|
behaviors: [ |
|
'drag-element', |
|
'drag-canvas', |
|
'zoom-canvas', |
|
'collapse-expand', |
|
{ |
|
type: 'hover-activate', |
|
degree: 1, |
|
}, |
|
], |
|
plugins: [ |
|
{ |
|
type: 'tooltip', |
|
getContent: (e, items) => { |
|
if (items.every((x) => x?.description)) { |
|
let result = ``; |
|
items.forEach((item) => { |
|
if (item?.description) { |
|
result += `<p>${item?.description}</p>`; |
|
} |
|
}); |
|
return result; |
|
} |
|
return undefined; |
|
}, |
|
}, |
|
], |
|
layout: { |
|
type: 'combo-combined', |
|
preventOverlap: true, |
|
comboPadding: 1, |
|
spacing: 20, |
|
}, |
|
node: { |
|
style: { |
|
size: 20, |
|
labelText: (d) => d.id, |
|
labelPadding: 30, |
|
|
|
|
|
labelPlacement: 'center', |
|
labelWordWrap: true, |
|
}, |
|
palette: { |
|
type: 'group', |
|
field: (d) => d.combo, |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}, |
|
edge: { |
|
style: (model) => { |
|
const { size, color } = model.data; |
|
return { |
|
stroke: color || '#99ADD1', |
|
lineWidth: size || 1, |
|
}; |
|
}, |
|
}, |
|
|
|
}); |
|
|
|
graph.setData(finalData); |
|
|
|
graph.render(); |
|
}; |
|
|
|
useEffect(() => { |
|
console.info('rendered'); |
|
render(); |
|
}, []); |
|
|
|
return <div ref={containerRef} className={styles.container} />; |
|
}; |
|
|
|
export default ForceGraph; |
|
|