vue2 d3实现企查查股权穿透图股权结构图效果详解

标题:Vue2 + D3 实现企查查股权穿透图股权结构图效果详解

在本文中,我们将介绍如何通过 Vue2 和 D3 库实现企查查股权穿透图股权结构图效果。下面将分为以下几个步骤进行讲解:

  1. 搭建项目环境
  2. 导入 D3 库
  3. 通过 D3 解析数据
  4. 绘制股权穿透图
  5. 美化股权穿透图

搭建项目环境

  • 使用 VueCli 创建一个新项目
  • 安装 ElementUI:npm install element-ui -S
  • 安装 D3:npm install d3

导入 D3 库

在 Vue 组件中,可通过如下代码引入 D3 库:

import * as d3 from "d3";

通过 D3 解析数据

在绘制股权穿透图前,需要通过 D3 将原始股权数据转化为可供绘图使用的 JSON 数据。通常,股权数据的格式为树形结构,例如:

{
  "id": "A1",
  "name": "公司A1",
  "children": [
    {
      "id": "B1",
      "name": "公司B1",
      "children": [
        {
          "id": "C1",
          "name": "公司C1",
          "children": []
        }
      ]
    },
    {
      "id": "B2",
      "name": "公司B2",
      "children": []
    }
  ]
}

通过 D3 库中提供的 tree() 方法,可将以上格式的数据转化为 D3 树形结构,方便后面使用。示例代码如下:

// 创建 D3 树形布局对象
var tree = d3.tree();

// 加载原始股权数据
var orgData = {
  "id": "A1",
  "name": "公司A1",
  "children": [
    {
      "id": "B1",
      "name": "公司B1",
      "children": [
        {
          "id": "C1",
          "name": "公司C1",
          "children": []
        },
        {
          "id": "C2",
          "name": "公司C2",
          "children": []
        }
      ]
    },
    {
      "id": "B2",
      "name": "公司B2",
      "children": []
    }
  ]
};

// 将原始数据转化为 D3 树形结构
var treeData = d3.hierarchy(orgData);
tree(treeData);

绘制股权穿透图

在导入 D3 库后,我们可以通过 D3 提供的绘图 API,快速绘制出股权穿透图。以下为示例代码:

// 绘制股权穿透图
var svg = d3.select("svg");
var g = svg.append("g")
  .attr("transform", "translate(50,50)");

// 绘制节点
var nodes = g.selectAll(".node")
  .data(treeData.descendants())
  .enter()
  .append("g")
  .attr("class", function(d) {
    return "node" + (d.children ? " node--internal" : " node--leaf");
  })
  .attr("transform", function(d) {
    return "translate(" + d.x + "," + d.y + ")";
  });

// 绘制节点文本
nodes.append("text")
  .attr("dy", "0.3em")
  .attr("x", function(d) {
    return d.children ? -8 : 8;
  })
  .style("text-anchor", function(d) {
    return d.children ? "end" : "start";
  })
  .text(function(d) {
    return d.data.name;
  });

// 绘制连接线
g.selectAll(".link")
  .data(treeData.descendants().slice(1))
  .enter()
  .append("path")
  .attr("class", "link")
  .attr("d", function(d) {
    return "M" + d.x + "," + d.y
        + "C" + (d.x + d.parent.x) / 2 + "," + d.y
        + " " + (d.x + d.parent.x) / 2 + "," + d.parent.y
        + " " + d.parent.x + "," + d.parent.y;
  });

美化股权穿透图

以上代码绘制出的股权穿透图效果较为简陋。下面将通过修改节点和连接线样式,使股权穿透图更美观。以下为示例代码:

// 设置样式
var linkWidth = 2; // 连接线宽度
var linkColor = "#ccc"; // 连接线颜色
var nodeRadius = 20; // 节点半径
var nodeStrokeWidth = 2; // 节点描边宽度
var nodeColor = "#fff"; // 节点颜色
var nodeStrokeColor = "steelblue"; // 节点描边颜色

// 绘制节点
var nodes = g.selectAll(".node")
  .data(treeData.descendants())
  .enter()
  .append("g")
  .attr("class", function(d) {
    return "node" + (d.children ? " node--internal" : " node--leaf");
  })
  .attr("transform", function(d) {
    return "translate(" + d.x + "," + d.y + ")";
  });

nodes.append("circle")
  .attr("r", nodeRadius)
  .attr("stroke", nodeStrokeColor)
  .attr("stroke-width", nodeStrokeWidth)
  .attr("fill", nodeColor);

// 绘制节点文本
nodes.append("text")
  .attr("dy", "0.3em")
  .attr("x", function(d) {
    return d.children ? -8 : 8;
  })
  .style("text-anchor", function(d) {
    return d.children ? "end" : "start";
  })
  .text(function(d) {
    return d.data.name;
  });

// 绘制连接线
g.selectAll(".link")
  .data(treeData.descendants().slice(1))
  .enter()
  .append("path")
  .attr("class", "link")
  .attr("stroke", linkColor)
  .attr("stroke-width", linkWidth)
  .attr("fill", "none")
  .attr("d", function(d) {
    return "M" + d.x + "," + d.y
        + "C" + (d.x + d.parent.x) / 2 + "," + d.y
        + " " + (d.x + d.parent.x) / 2 + "," + d.parent.y
        + " " + d.parent.x + "," + d.parent.y;
  });

以上代码将连线改为实线,节点半径增大并添加描边效果,使股权穿透图更美观。

以上为实现股权穿透图的完整攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue2 d3实现企查查股权穿透图股权结构图效果详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue NextTick介绍与使用原理

    Vue NextTick介绍与使用原理 Vue NextTick是Vue提供的一个API, 用于在DOM更新后执行异步回调。在前端开发中,我们经常遇到需要在DOM更新完毕后,再执行一些操作的场景,例如修改某个元素的高度或宽度等。这时候,就需要用到Vue NextTick。 NextTick使用方法 Vue中,我们可以通过以下方式使用Vue NextTick:…

    Vue 2023年5月28日
    00
  • vue中如何解除数据之间的双向绑定

    在 Vue 中,数据双向绑定是其最重要的特性之一,但在某些情况下,我们可能需要解除某些数据的双向绑定,这可以通过以下两种方法实现: 1. 通过 Object.freeze() 冻结数据 Object.freeze() 是一个内置函数,它可以防止对象被修改。使用 Object.freeze() 方法将数据对象冻结即可解除双向绑定。这个方法会遍历对象的属性,并将…

    Vue 2023年5月28日
    00
  • vue引入iconfont图标库的优雅实战记录

    下面为你介绍如何优雅地在Vue中引入Iconfont图标库。 1. 注册Iconfont账号并创建项目 首先,在Iconfont官网上注册一个账号,并创建一个项目。 2. 选择图标并添加至项目 在项目中选择需要使用的图标,并将其添加至项目。 3. 生成Font-class代码 选择添加至项目的图标后,在页面右上角点击“生成代码”按钮,选择“Font-clas…

    Vue 2023年5月27日
    00
  • Vue完整项目构建(进阶篇)

    Vue完整项目构建(进阶篇)攻略 Vue完整项目构建是Vue.js框架的一个重要应用场景,本篇攻略将介绍如何构建一个完整的Vue项目。 步骤一:项目初始化 使用npm命令来初始化一个Vue项目,具体命令如下: npm init vue-project 该命令将会生成一个Vue项目的初始化结构。接下来需要安装Vue的核心依赖包和其他的工具包。可以通过以下命令来…

    Vue 2023年5月28日
    00
  • Vue 嵌套路由使用总结(推荐)

    Vue 嵌套路由使用总结(推荐)攻略 什么是嵌套路由? 在 Vue 路由中,嵌套路由就是将多个组件的路由嵌套在一起,形成一个组件树结构。父路由对应的组件内部有子路由对应的组件,子路由对应的组件内部又可以嵌套更深层的路由和组件。在一个页面内,使用嵌套路由可以实现多级导航和页面切换的功能。 如何使用嵌套路由? 1. 定义父路由和子路由 在路由配置中,我们需要定义…

    Vue 2023年5月27日
    00
  • 详解VUE 数组更新

    关于”详解VUE 数组更新”的完整攻略,可以按照以下步骤进行讲解: 1. 首先明确要解决的问题 在 Vue.js 中,当一个数组被直接赋值给一个新变量时,原数组和新变量将引用同一个数组对象。此时,当对其中一个变量进行修改的时候,另一个变量的值也会被同时修改,这样就会影响到 Vue 的响应式更新机制。 例如,下面的代码只是将数组 a 赋值给了变量 b,但在修改…

    Vue 2023年5月28日
    00
  • 详解vue移动端日期选择组件

    让我详细讲解一下“详解Vue移动端日期选择组件”的完整攻略。 标题1 标题2 标题3 首先,这篇攻略将详细介绍如何使用Vue框架开发移动端日期选择组件,并且会包含至少两个示例说明。下面就让我们开始吧。 组件的功能需求 在开始编写组件之前,我们需要先定义组件的功能需求,以便于后续在设计中进行调整。 支持用户选择年份、月份和日期。 根据年份和月份计算当月天数。 …

    Vue 2023年5月28日
    00
  • 关于vue中路由的跳转和参数传递,参数获取

    对于vue中的路由跳转和参数传递,可以通过vue-router这个插件来实现。下面我就一步步讲解使用vue-router实现路由跳转和参数传递的完整攻略。 路由跳转 安装和配置vue-router 首先需要安装vue-router插件,可以通过npm命令进行安装: npm install vue-router –save 安装完成后,在项目的入口文件中导入…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部