图形化引擎antv/G6
1.参考: G6 TreeGraph树图默认展开几层节点
graph.data(data) graph.render() graph.fitCenter() // 移到图中心 setTimeout(() => { // 1 默认展开两层节点,之后,重新渲染 G6.Util.traverseTree(data, function(item) { console.log(item) if (item.depth > 0) { //collapsed为true时默认收起 item.collapsed = true } }) graph.render() graph.fitCenter() // 移到图中心 }, 10)
2.树形节点增删改,需要重新调用 graph.render()
3.树形图,右键菜单插件
以此为例,右键菜单的触发事件回调函数: handleMenuClick
const menu = new G6.Menu({ offsetX: 10, offsetY: 10, itemTypes: ['node'], getContent(e) { const {item} = e console.log(item.getModel()) let {bqglParentUuid} = item.getModel() if (bqglParentUuid == 'root') { return `` } const outDiv = document.createElement('div') outDiv.innerHTML = `` return outDiv }, handleMenuClick: (target, item) => { var nodeId = item.get('id') const newParentData = graph.findDataById(nodeId) let newchildren = newParentData.children switch (target.className) { case 'add': var childData = { id: 'child-data-' + new Date().getTime(), type: 'flow-rect', name: 'x-' } graph.addChild(childData, nodeId) graph.render() graph.fitCenter() // 移到图中心 graph.fitView() break case 'addClassification': console.log(target.innerText) break case 'del': graph.removeChild(nodeId) graph.render() graph.fitCenter() // 移到图中心 graph.fitView() // graph.fitView() break case 'proview': console.log(target.innerText) break case 'edit': console.log(target.innerText) break default: break } } })
4.树形图 矩形上线连接点的位置
//自定义节点 G6.registerNode( 'flow-rect', { getAnchorPoints() { //矩形上线连接点的位置 return [ [0.5, 0], [0.5, 1] ] } }, 'rect' ) //连接线 G6.registerEdge('line-arrow', { options: { style: { stroke: '#ccc' } }, draw: function draw(cfg, group) { const startPoint = cfg.startPoint const endPoint = cfg.endPoint const stroke = (cfg.style && cfg.style.stroke) || this.options.style.stroke const startArrow = (cfg.style && cfg.style.startArrow) || undefined const endArrow = (cfg.style && cfg.style.endArrow) || undefined //连接线路径 const keyShape = group.addShape('path', { attrs: { path: [ ['M', startPoint.x, startPoint.y], ['L', startPoint.x, (startPoint.y + endPoint.y) / 2], ['L', endPoint.x, (startPoint.y + endPoint.y) / 2], ['L', endPoint.x, endPoint.y] ], stroke, lineWidth: 1, startArrow, endArrow }, className: 'edge-shape', name: 'edge-shape' }) return keyShape } })
5. 点击切换选中
setState(name, value, item) { var group = item.getContainer() // 获取外边框 var nodeRect = group.find(function(e) { return e.get('name') === 'node-rect' }) // 获取任务名称 var collapseTitleText = group.find(function(e) { return e.get('name') === 'node-name' }) // 获取折叠点 var collapseText = group.find(function(e) { return e.get('name') === 'collapse-text' })// 设置状态 if (name === 'selected') { if (value) { nodeRect.attr({ stroke: '#1258ED', lineWidth: 2 }) collapseTitleText.attr({ fill: '#1258ED' }) } else { nodeRect.attr({ stroke: '#999999', lineWidth: 1 }) collapseTitleText.attr({ fill: '#333' }) } }
}
//点击节点文字 graph.on('node-name:click', e => { const {item} = e graph.setItemState(item, 'selected', !item.hasState('selected')) // 切换选中 })
。。。