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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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 
你可以使用Vue.js和D3.js来实现组织架构横向树状图,并且可以自定义节点的样式。 首先,你需要安装Vue.js和D3.js。可以使用npm或yarn来安装它们: ``` npm install vue d3 ``` 或者 ``` yarn add vue d3 ``` 接下来,在你的Vue组件中,可以使用D3.js来绘制横向树状图。以下是一个简单的示例: ```html <template> <div id="chart"></div> </template> <script> import * as d3 from &#39;d3&#39;; export default { mounted() { this.drawChart(); }, methods: { drawChart() { // 获取SVG容器 const svg = d3.select(&#39;#chart&#39;) .append(&#39;svg&#39;) .attr(&#39;width&#39;, 600) .attr(&#39;height&#39;, 400); // 构造树状图数据 const data = { name: &#39;CEO&#39;, children: [ { name: &#39;Manager&#39; }, { name: &#39;Manager&#39; }, { name: &#39;Manager&#39; } ] }; // 创建树状图布局 const layout = d3.tree().size([400, 400]); // 转换数据为层次结构 const root = d3.hierarchy(data); const treeData = layout(root); // 创建节点和连线 const nodes = svg.selectAll(&#39;.node&#39;) .data(treeData.descendants()) .enter() .append(&#39;g&#39;) .attr(&#39;class&#39;, &#39;node&#39;) .attr(&#39;transform&#39;, d => `translate(${d.y},${d.x})`); nodes.append(&#39;circle&#39;) .attr(&#39;r&#39;, 10) .style(&#39;fill&#39;, &#39;steelblue&#39;) // 在这里可以自定义节点的样式 nodes.append(&#39;text&#39;) .attr(&#39;dy&#39;, 4) .attr(&#39;x&#39;, d => d.children ? -8 : 8) .style(&#39;text-anchor&#39;, d => d.children ? &#39;end&#39; : &#39;start&#39;) .text(d => d.data.name); } } }; </script> <style> .node circle { fill: steelblue; } </style> ``` 上述代码中,使用D3.js创建了一个SVG容器,并在其中绘制了树状图。你可以通过自定义节点的样式,例如修改圆的颜色、大小等来实现标签的自定义。 这只是一个简单的示例,你可以根据你的需求进一步自定义和扩展。希望对你有帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jerry24ever

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

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

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

打赏作者

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

抵扣说明:

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

余额充值