antv G6默认树图的节点展开2个层级(包含根节点)并避免占位

import React, { useEffect, useRef } from 'react';
import G6 from '@antv/g6';

const CollapsibleTreeDiagram = () => {
  const containerRef = useRef(null);

  useEffect(() => {
    // 初始化图形实例,设置 defaultExpandLevel 为 1
    const graph = new G6.TreeGraph({
      container: containerRef.current,
      width: 800,
      height: 600,
      modes: {
        default: ['drag-canvas', 'zoom-canvas'], // 不启用默认的 collapse-expand 行为
      },
      layout: {
        type: 'compactBox', // 使用紧凑盒布局算法
        direction: 'TB',
        getId: (d) => d.id,
        getHeight: () => 16,
        getWidth: () => 16,
        getVGap: () => 10,
        getHGap: () => 50,
        ignoreEdgeLength: true, // 忽略边的长度,避免为未展开的子节点预留空间
      },
      defaultNode: {
        size: 24,
        style: {
          fill: '#C6E5FF',
          stroke: '#5B8FF9',
        },
      },
      defaultEdge: {
        style: {
          stroke: '#A3C5FD',
        },
      },
      nodeStateStyles: {
        hover: {
          fill: '#7FC4FF',
        },
      },
      // 设置默认展开层级为 1  根节点为0
      defaultExpandLevel: 1,
    });

    // 定义树结构数据,并手动设置前两层节点为展开状态
    function expandFirstTwoLevels(data, level = 0) {
      if (level < 1 && data.children) {
        data.collapsed = false;
        data.children.forEach(child => expandFirstTwoLevels(child, level + 1));
      } else if (data.children) {
        data.collapsed = true; // 默认折叠第三层及更深的节点
      }
    }

    const data = {
      id: 'root',
      label: 'Root Node',
      children: [
        {
          id: 'child1',
          label: 'Child Node 1',
          children: [
            { id: 'grandchild1', label: 'Grandchild Node 1' },
            { id: 'grandchild2', label: 'Grandchild Node 2', children: [
              { id: 'greatgrandchild1', label: 'Great Grandchild Node 1' }
            ]},
          ],
        },
        {
          id: 'child2',
          label: 'Child Node 2',
          children: [
            { id: 'grandchild3', label: 'Grandchild Node 3' },
          ],
        },
      ],
    };

    // 设置前两个层级的节点为展开状态
    expandFirstTwoLevels(data);

    // 渲染数据到图形中
    graph.data(data);
    graph.render();

    // 监听节点点击事件
    graph.on('node:click', (evt) => {
      const clickedNode = evt.item;
      const model = clickedNode.getModel();
      
      // 只展开或折叠当前节点,而不影响其子节点的状态
      const newCollapsedState = !model.collapsed;

      // 更新节点的 collapsed 状态
      graph.updateItem(clickedNode, { collapsed: newCollapsedState });

      // 如果是展开操作,确保子节点保持折叠状态
      if (!newCollapsedState && clickedNode.get('children')) {
        clickedNode.get('children').forEach(child => {
          graph.updateItem(child, { collapsed: true }); // 确保子节点保持折叠
        });
      }

      // 刷新布局以反映更改
      graph.refreshLayout();
    });

    graph.fitCenter();
    
    // 清理图形实例
    return () => {
      graph.destroy();
    };
  }, []);

  return <div ref={containerRef} style={{ border: '1px solid #ccc', height: '600px' }} />;
};

export default CollapsibleTreeDiagram;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值