Spaces:
Paused
Paused
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, // ππ» Activate relations. | |
}, | |
], | |
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, | |
// labelOffsetX: 20, | |
// labelOffsetY: 5, | |
labelPlacement: 'center', | |
labelWordWrap: true, | |
}, | |
palette: { | |
type: 'group', | |
field: (d) => d.combo, | |
}, | |
// state: { | |
// highlight: { | |
// fill: '#D580FF', | |
// halo: true, | |
// lineWidth: 0, | |
// }, | |
// dim: { | |
// fill: '#99ADD1', | |
// }, | |
// }, | |
}, | |
edge: { | |
style: (model) => { | |
const { size, color } = model.data; | |
return { | |
stroke: color || '#99ADD1', | |
lineWidth: size || 1, | |
}; | |
}, | |
}, | |
// data: graphData, | |
}); | |
graph.setData(finalData); | |
graph.render(); | |
}; | |
useEffect(() => { | |
console.info('rendered'); | |
render(); | |
}, []); | |
return <div ref={containerRef} className={styles.container} />; | |
}; | |
export default ForceGraph; | |