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 导出文件,携带请求头token操作

    让我详细讲解一下 “vue 导出文件,携带请求头token操作” 的完整攻略。 导出文件 要导出文件,我们可以利用浏览器提供的 download 和 Blob API 来实现。具体的步骤如下: 创建一个 Blob 对象,存储文件的内容。我们可以使用 new Blob() 方法来创建一个 Blob 实例。通常我们需要将要导出的内容以字符串形式传递给 Blob …

    Vue 2023年5月27日
    00
  • vue.js的简单自动求和计算实例

    下面为大家讲解一下“Vue.js的简单自动求和计算实例”的完整攻略。 思路概述 首先,我们需要使用 Vue.js 组件化的思想,将输入框和显示框拆分成独立的组件,这样方便我们进行状态管理和更新视图。 其次,我们需要监听输入框的值变化,并对输入的数据进行求和计算,最后将结果显示在显示框中。 示例说明一 下面我们通过一个实例进一步说明上述思路: 在 HTML 中…

    Vue 2023年5月28日
    00
  • vue简单的store详解

    Vue简单的Store详解 在Vue中,通过使用Vuex来管理应用的状态。它包含了一个全局的状态管理器,通过单向数据流的方式来管理数据。Vuex可以集中管理组件之间的数据共享,以及对数据的具体控制。 Vuex Store 在Vuex中,一个store就是把用户的所有状态集中到一起的容器,可以通过store中的state来管理用户的所有状态。在store中,可…

    Vue 2023年5月28日
    00
  • 浅谈Vue+Ant Design form表单的一些坑

    浅谈Vue+Ant Design form表单的一些坑 前言 在Vue结合Ant Design使用form表单时,可能会遇到一些坑。本攻略将会详细讲解如何解决这些坑,并提供一些示例说明。 Ant Design form表单-基本使用 首先,在使用Ant Design form表单时,我们需要先安装Ant Design of Vue。安装命令如下: npm i…

    Vue 2023年5月28日
    00
  • 简单谈谈Vue 模板各类数据绑定

    下面我就来详细讲解“简单谈谈Vue 模板各类数据绑定”的完整攻略。 什么是Vue模板数据绑定 Vue.js是一个用于构建用户界面的渐进式JavaScript框架,可以轻松地实现数据与模板的双向绑定,让数据的变化自动更新到视图中,从而简化了前端开发的流程。其中,模板数据绑定就是Vue.js最为重要而且基本的特性之一。 模板数据绑定主要有以下几种方式: 1.插值…

    Vue 2023年5月27日
    00
  • Vue使用provide各种传值后inject获取undefined的问题及解决

    在Vue中,可以通过provide和inject实现非父子组件之间的数据传递。但是,在实际使用中,会遇到使用provide传递的值在inject中获取时出现undefined的情况。本文将详细讲解这个问题以及解决方案。 问题表现 使用provide向子组件提供数据,但在子组件中使用inject获取时,却获取到了undefined。 问题原因 在Vue中,pr…

    Vue 2023年5月28日
    00
  • vue路由切换之淡入淡出的简单实现

    下面是“vue路由切换之淡入淡出的简单实现”的完整攻略: 一、背景介绍 在web应用程序中,经常需要通过路由来实现页面切换,给用户带来更好的交互体验。而在路由切换时,淡入淡出效果通常能使用户感觉更加温和,增强用户体验。 本文主要介绍如何在vue项目中实现路由切换时的淡入淡出效果。 二、基本思路及方法 要实现vue路由切换时的淡入淡出效果,基本思路是通过CSS…

    Vue 2023年5月27日
    00
  • JavaScript实现简易计算器案例

    JavaScript实现简易计算器案例攻略 项目背景 本项目旨在通过JavaScript实现一个简易的计算器,用户可以在浏览器上输入数字和运算符进行加减乘除的四则运算。 程序思路 HTML界面布局: 在HTML中使用<input>标签创建输入框,用户可通过该标签输入数字和运算符。 在HTML中创建4个按钮,分别代表加减乘除四种运算,用户可通过点击…

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