用d3+vue实现一个可折叠的树状图

本文介绍如何使用D3库结合Vue框架创建可交互的树状图,用于展示接口调用链及其详细信息,如耗时、调用时间等,通过自定义配置实现展开与折叠功能及数据刷新后的动态更新。

用d3+vue实现一个可折叠的树状图

背景

前两天接到了一个需求,监控系统要实现一个可以折叠展开的树状图来展示完整的接口调用链,同时右侧要展示一些接口的相关信息诸如耗时、调用时间、返回值之类的。

Demo

先在网上找了个demo,完美符合了需求。
在这里插入图片描述
Demo地址:点击跳转demo

效果预览

接下来就是在demo的基础上加一些自定义的东西丰富下树状图,先给大家看一下效果:
展开状态:
在这里插入图片描述
折叠状态:
在这里插入图片描述

代码

设计思路很简单,先把demo封装成一个方法,返回值就是html代码,直接在父组件里通过操作dom替换成新的树状图,这样就可以完成展开折叠包括数据刷新后树状图的更新,不过感觉不是封装的很好,之后准备把一些展示的列相关的数据配置成变量。
下面是tree.js的代码:

import * as d3 from 'd3'

export const Tree = (data, {
    
     width = 1000, }, funcs) => {
   
   
    let i = 0;
    const root = d3.hierarchy(data).eachBefore(d => d.index = i++);
    const nodes = root.descendants();
    //node size
    const nodeSize = 20;
    //链路图右侧数据展示配置
    const columns = [
        {
   
   
            label: 'StartTime',
            value: d => {
   
   
                return d.traceRawData.startTime
            },
            format: (d, type) => {
   
   
                if (type === 'value') {
   
   
                    let startTime = d.data.traceRawData.startTime;
                    if (startTime === null) {
   
   
                        return '-';
                    }
                    else {
   
   
                        return startTime.slice(0, 10) + ' ' + startTime.slice(11, 19);
                    }
                }
                if (type === 'color') {
   
   
                    return 'black'
                }
                if (type === 'font-weight') {
   
   
                    return 'none'
                }
            },
            x: 420
        },
        {
   
   
            label: 'RetCode',
            value: d => {
   
   
                return d.traceRawData.tretCode
            },
            format: (d, type) => {
   
   
                if (type === 'value') {
   
   
                    let retCode = d.data.traceRawData.tretCode;
                    if (retCode === null) {
   
   
                        return '-';
                    }
                    else {
   
   
                        return retCode.slice(0, 10) + ' ' + retCode.slice(11, 19);
                    }
                }
                if (type === 'color') {
   
   
                    return 'black'
                }
                if (type === 'font-weight') {
   
   
                    return 'none'
                }
            },
            x: 570
        }
    ]
    //链路图右侧耗时展示
    const cost = [
        {
   
   
            label: 'Cost',
            value: d => {
   
   
                return d.traceRawData.duration
            },
            format: (d, type) => {
   
   
                if (type === 'value') {
   
   
                    let duration = d.data.traceRawData.duration;
                    if (duration === null) {
   
   
                        return '-'
                    }
                    if (duration > 1000) {
   
   
                        if (duration > 1000000) {
   
   
                            return (duration / 1000000).toFixed(1) + 's'
                        }
                        else {
   
   
                            return 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry24ever

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值