參考 CSDN 知識庫樹形結構 (如 https://lib.csdn.net/base/react/structure),實現節點可拖拽、縮放、層級展開/收起、關係連線的交互式知識圖譜。
<script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
const chart = echarts.init(document.getElementById('main'));
const option = {
tooltip: { formatter: '{b}' }, // 節點名稱
legend: [{ data: ['分類1', '分類2'] }],
series: [{
type: 'graph',
layout: 'force', // 關鍵:力導向佈局
force: {
repulsion: 100, // 斥力
edgeLength: 100, // 邊長度
gravity: 0.1, // 引力
layoutAnimation: true // 動畫
},
roam: true, // 支持縮放平移
draggable: true, // 節點可拖拽
categories: [ // 節點分類 (顏色/樣式)
{ name: '分類1' },
{ name: '分類2' }
],
data: [ // 節點數據
{ name: 'React', value: 10, category: 0, symbolSize: 30 },
{ name: 'Vue', value: 8, category: 0, symbolSize: 25 },
{ name: 'JSX', value: 5, category: 1, symbolSize: 20 }
],
links: [ // 邊數據
{ source: 'React', target: 'JSX' },
{ source: 'Vue', target: 'JSX' }
],
label: { show: true, position: 'right', formatter: '{b}' },
lineStyle: { color: 'source', curveness: 0.3 }
}]
};
chart.setOption(option);
chart.on('click', params => { if (params.dataType === 'node') loadChildren(params.name); }),動態 appendData 或 setOption 更新 data/links。chart.getZr().on('contextmenu', ...) 獲取畫布右鍵事件。progressive 渲染、簡化 symbol (用 circle 替代圖片)、關閉 layoutAnimation、採用 WebGL 渲染器 (ECharts-GL)。若想深入理解力導向算法、ZRender 渲染管線、事件分發機制:
git clone https://github.com/apache/echarts.gitsrc/chart/graph/ — Graph 圖表實現src/layout/force.ts — 力導向佈局核心算法src/zrender/ — Canvas 2D 渲染引擎核心npm run dev 啟動開發服務器,修改源碼即時熱更新觀察效果。roam/draggable/categories 滿足 90% 需求。force.ts 與 zrender 核心,理解「物理模擬佈局 + Canvas 保留模式渲染」的現代可視化架構。progressive、簡化樣式、考慮 WebGL;避免在 force 佈局中頻繁 setOption 觸發重佈局抖動。掌握 ECharts 力導向圖,即可輕鬆實現 CSDN 風格知識庫樹形圖,並具備向專業可視化方向深入的技術基石。