如何使用 vue + d3 画一棵树


Posted in Javascript onDecember 03, 2018

github pages

如何使用 vue + d3 画一棵树

vue 和 d3 的角色

画图可分为两步:

  1. 元素坐标计算
  2. 数据绑定

坐标计算只需要一些 api,本文使用 d3。

数据绑定既可以借助 d3,也可以使用 vue。d3 通过操作 dom 实现,有点像 jQuery,d3 针对数据和 dom 的状态提出了三个概念:Update、Enter、Exit,感兴趣的可以看官网。本文使用 vue 做数据绑定

总结:使用 d3 提供的 api 计算元素坐标,使用 vue 进行数据绑定

坐标计算

一棵树由节点和连接构成,只需要计算出这两种元素的坐标

即可

画一棵树常见的有两种数据结构,一种是嵌套的,一种是扁平的。如下:

// 嵌套的
var treeData = {
 name: '中国',
 children: [{
  name: '北京',
  children: [{
   name: '海淀'
  }, {
   name: '朝阳'
  }]
 }, {
  name: '上海'
 }]
};
// 扁平的
var flattenData = [{
 name: '中国',
 parent: ''
}, {
 name: '北京',
 parent: '中国'
}, {
 name: '上海',
 parent: '中国'
}, {
 name: '海淀',
 parent: '北京'
}, {
 name: '朝阳',
 parent: '北京'
}]

对于嵌套的数据,使用 d3.hierarchy() 计算坐标,对于扁平的,使用 d3.stratify()。得到的结构如下(列举根节点):

var hierarchyNode = {
 depth: 0
 height: 2

 parent: null
 x: 60
 y: 0,
 data: {
  name: "中国",
  children: [] 
 },
 children: []
};

得到根节点后使用 descendants() 获取所有节点信息,links() 获取所有连接信息。节点的结构如上述,连接结构如下:

var link = {
 source: Node,
 target: Node
}

至此,已获取到所有元素的坐标

数据绑定

使用 svg

树的节点就是 rect + text,如下:

<g :transform="rootTransform">
 <rect :width="nodeWidth" :height="nodeHeight" :fill="nodeFill"></rect>
 <text :fill="nodeTextColor" text-anchor="middle" dominant-baseline="middle"
  :y="nodeHeight / 2" :x="nodeWidth / 2">{{node.data.name}}</text>
</g>

连接就是 path,如下:

<g>
 <path :d="getLinkPath(link)" :stroke="linkStroke" fill="none" :stroke-width="linkStrokeWidth"></path>
</g>

code

talk is cheap show me the code

github/vue-d3-tree-example

总结

以上所述是小编给大家介绍的如何使用 vue + d3 画一棵树,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
学习js所必须要知道的一些
Mar 07 Javascript
用js生产批量批处理执行命令
Jul 28 Javascript
javascript 有趣而诡异的数组
Apr 06 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
Mar 01 Javascript
JS的replace方法详细介绍
Nov 09 Javascript
javasript实现密码的隐藏与显示
May 08 Javascript
jQuery通过deferred对象管理ajax异步
May 20 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
Oct 25 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
Angular6 写一个简单的Select组件示例
Aug 20 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
Nov 12 Javascript
JavaScript实例 ODO List分析
Jan 22 Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 #Javascript
浅谈ng-zorro使用心得
Dec 03 #Javascript
JS跨域请求的问题解析
Dec 03 #Javascript
VueJS 组件参数名命名与组件属性转化问题
Dec 03 #Javascript
Vue.Draggable拖拽功能的配置使用方法
Jul 29 #Javascript
小程序实现授权登陆的解决方案
Dec 02 #Javascript
mpvue 单文件页面配置详解
Dec 02 #Javascript
You might like
php中的登陆login
2007/01/18 PHP
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
php实现在限定区域里自动调整字体大小的类实例
2015/04/02 PHP
php中JSON的使用方法
2015/04/30 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
Javascript 实用小技巧
2010/04/07 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
理解javascript对象继承
2016/04/17 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
jquery实现抽奖功能
2020/10/22 jQuery
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
python 容器总结整理
2017/04/04 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
启动targetcli时遇到错误解决办法
2017/10/26 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
使用django实现一个代码发布系统
2019/07/18 Python
python GUI模拟实现计算器
2020/06/22 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
医学生个人求职信范文
2013/09/24 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
Go语言基础知识点介绍
2021/07/04 Golang