如何使用 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 相关文章推荐
现如今最流行的JavaScript代码规范
Mar 08 Javascript
原生JavaScript制作微博发布面板效果
Mar 11 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
May 28 Javascript
微信小程序 石头剪刀布实例代码
Jan 04 Javascript
JSON字符串和JSON对象相互转化实例详解
Jan 05 Javascript
vue实现选项卡及选项卡切换效果
Apr 24 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
vue.js中proxyTable 转发请求的实现方法
Sep 20 Javascript
Vue实现一个无限加载列表功能
Nov 13 Javascript
基于Three.js实现360度全景图片
Dec 30 Javascript
Vue 3.x+axios跨域方案的踩坑指南
Jul 04 Javascript
JS实现点星星消除小游戏
Mar 24 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部分常见问题总结
2006/10/09 PHP
杏林同学录(五)
2006/10/09 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
jQuery实现动态控制页面元素的方法分析
2017/12/20 jQuery
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
python fabric实现远程操作和部署示例
2014/03/25 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
python和ruby,我选谁?
2017/09/13 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
Python中return self的用法详解
2018/07/27 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python解析多层json操作示例
2019/12/30 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
Linux Interview Questions For software testers
2012/06/02 面试题
清明节扫墓活动方案
2014/03/02 职场文书
计划生育标语
2014/06/23 职场文书
保密工作目标责任书
2014/07/28 职场文书
欢迎新生标语
2014/10/06 职场文书
财务整改报告范文
2014/11/05 职场文书
保密工作整改报告
2014/11/06 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
教学反思怎么写
2016/02/24 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫