您好,登錄后才能下訂單哦!
本篇文章和大家了解一下react用g6的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。
react用g6使用方法:1、通過“npm install --save @antv/g6”命令在項目引入AntV G6;2、使用“yarn install”重新載入依賴;3、在需要使用到G6的js文件中引入G6即可。
react能用g6嗎?
能用。
React中使用AntV G6
AntV G6:G6 是一個簡單、易用、完備的圖可視化引擎,它在高定制能力的基礎上,提供了一系列設計優雅、便于使用的圖可視化解決方案。能幫助開發者搭建屬于自己的圖可視化、圖分析、或圖編輯器應用。官網
AntV G6的引入
項目中使用npm對包引入
npm install --save @antv/g6
重新載入依賴
yarn install
在需要使用到G6的js文件中引入G6
import G6 from '@antv/g6';
自此,準備工作結束,下面開始使用G6繪制需要的關系圖,以力導向圖為例描述一對多、一對一的關系。
AntV G6的使用
創建容器:在 HTML 中創建一個用于容納 G6 繪制的圖的容器,通常為 div 標簽。G6 在繪制時會在該容器下追加 canvas 標簽,然后將圖繪制在其中。
ref:在 React 中,可以通過ref.current獲取到真實的 DOM 元素。Forwarding Refs(官方文檔)
<div ref={ref} id="test"/>
創建關系圖:創建關系圖(實例化)時,至少需要為圖設置容器、寬和高。其余請參考圖例對應的API以及官方API文檔,按需配置。
graph = new G6.Graph({ container: ref.current, width: width < 1000 ? 387 : width, height: width < 1000 ? 220 : 550, layout: { type: 'force', preventOverlap: true, linkDistance: (d) => { if (d.source.id === 'node0') { return 10; } return 80; }, nodeStrength: (d) => { if (d.isLeaf) { return 200; } return -500; }, edgeStrength: (d) => { if (d.source.edgeStrength) { return 0.1; } return 0.8; }, }, defaultNode: { color: '#5B8FF9', }, edgeStateStyles: { highlight: { stroke: '#5B8FF9' // 這個顏色可以根據個人喜好進行修改 } }, modes: { default: ['drag-canvas', 'zoom-canvas'], }, });
數據處理及準備:根據所需圖表的數據格式,對數據進行處理。
配置數據源并渲染:
graph.data(data); // 讀取 Step 2 中的數據源到圖上 graph.render(); // 渲染圖
AntV G6的基本使用闡述完后,需要注意在React中,G6與AntV L7及AntV G2,BizCharts有所不同,AntV G6在使用過程中需要訪問節點,將其圖形作為組件使用時,如果忽略這一點,則會出現問題。 React中使用G6(官網文檔)
AntV G6在React中注意
將渲染G6圖形的Demo作為匿名函數返回,同時函數return的應為上文創建的容器,在其他js文件中調用Demo時作為組件,同時傳入的參數為匿名函數的形參。
上文中第二步:“創建關系圖”中生成的實例應在副作用useEffect中定義。
由于在CompotentDidMount中獲取數據,當渲染Demo時可能會存在數據并未得到響應便渲染Demo導致報錯,解決辦法如下:
{deviceData.length ? <G6Picture g6Data={deviceData}/> : <></>}
實現效果
完整代碼及部分解釋如下:
Demo.js
import G6 from '@antv/g6'; import React, {useEffect} from "react"; import groupBy from 'lodash/groupBy' import router from "umi/router"; function dealData(data) {//數據處理函數 const dataGroup = groupBy(data, (item) => [item.chipGroupName]) const nodes = []; const edges = []; let index = 0; nodes.push({id: `node${index}`, size: 90, label: "芯片組管理", edgeStrength: true}) for (const key in dataGroup) { index += 1; nodes.push({id: `node${index}`, size: 60, label: key, edgeStrength: false, isLeaf: true}) edges.push({source: `node0`, target: `node${index}`, label: '芯片', routerFlag: 0}) if (dataGroup[key]) { const indexTemp = index; dataGroup[key].map((item) => { index += 1; nodes.push({id: `node${index}`, size: 40, label: item.name, edgeStrength: false}) edges.push({source: `node${indexTemp}`, target: `node${index}`, label: "產品", routerFlag: 1}) }) } } const returnData = { nodes: [...nodes], edges: [...edges], } return returnData; } export default function (props) {//props為傳入的參數 const ref = React.useRef(null) let graph = null; useEffect(() => { const {g6Data} = props; const data = dealData(g6Data); const width = document.getElementById('test').clientWidth;//獲取當前寬度 if (!graph) { graph = new G6.Graph({//生成關系圖實例 container: ref.current,//獲取真實的DOM節點 width: width < 1000 ? 387 : width,//根據所需大小定義高度、寬度 height: width < 1000 ? 220 : 550, layout: {//根據要求所需及官方API文檔配置 type: 'force', preventOverlap: true, linkDistance: (d) => { if (d.source.id === 'node0') { return 10; } return 80; }, nodeStrength: (d) => {//根據要求所需及官方API文檔配置 if (d.isLeaf) { return 200; } return -500; }, edgeStrength: (d) => {//根據要求所需及官方API文檔配置 if (d.source.edgeStrength) { return 0.1; } return 0.8; }, }, defaultNode: {//根據要求所需及官方API文檔配置 color: '#5B8FF9', }, edgeStateStyles: {//根據要求所需及官方API文檔配置 highlight: { stroke: '#5B8FF9' // 這個顏色可以根據個人喜好進行修改 } }, modes: {//根據要求所需及官方API文檔配置 default: ['drag-canvas', 'zoom-canvas'], }, }); } const {nodes} = data; graph.data({//綁定數據 nodes, edges: data.edges.map((edge, i) => { edge.id = `edge${i}`; return Object.assign({}, edge); }), }); graph.render();//渲染圖形 //下面為交互事件配置及操作函數 graph.on('node:dragstart', (e) => { graph.layout(); refreshDragedNodePosition(e); }); graph.on('node:drag', (e) => { refreshDragedNodePosition(e); }); graph.on('node:dragend', (e) => { e.item.get('model').fx = null; e.item.get('model').fy = null; }); graph.zoom(width < 1000 ? 0.7 : 1, {x: 300, y: 300}); graph.on('node:mouseenter', (ev) => { const node = ev.item; const edges = node.getEdges(); const model = node.getModel(); const size = model.size * 1.2; graph.updateItem(node, { size, }); edges.forEach((edge) => { graph.setItemState(edge, 'highlight', true) }); }); graph.on('node:click', (e) => { router.push({pathname: `/DeviceSetting/ChipsetManagement`}) }); graph.on('node:mouseleave', (ev) => { const node = ev.item; const edges = node.getEdges(); const model = node.getModel(); const size = model.size / 1.2; graph.updateItem(node, { size, }); edges.forEach((edge) => graph.setItemState(edge, 'highlight', false)); }); function refreshDragedNodePosition(e) { const model = e.item.get('model'); model.fx = e.x; model.fy = e.y; } }, []); return <> <div ref={ref} id="test"/> </>; };
具體使用Demo的js文件:
import G6Picture from './Demo' render( return( <> {deviceData.length ? <G6Picture g6Data={deviceData}/> : <></>} </> ) )
以上就是react用g6的方法的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。