如何使用 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可突破windows弹退效果代码
Aug 09 Javascript
一个收集图片的bookmarlet(js 刷新页面中的图片)
May 27 Javascript
jquery预览图片实现鼠标放上去显示实际大小
Jan 16 Javascript
js身份证判断方法支持15位和18位
Mar 18 Javascript
特殊情况下如何获取span里面的值
May 20 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
Apr 26 Javascript
Angularjs 动态改变title标题(兼容ios)
Dec 29 Javascript
微信小程序 下拉菜单简单实例
Apr 13 Javascript
关于jquery form表单序列化的注意事项详解
Aug 01 jQuery
Vue.JS项目中5个经典Vuex插件
Nov 28 Javascript
element ui table(表格)实现点击一行展开功能
Dec 04 Javascript
JavaScript获取当前url路径过程解析
Dec 27 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学习之变量的使用
2011/05/29 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
奇妙的js
2007/09/24 Javascript
Prototype Object对象 学习
2009/07/12 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
简单谈谈python中的多进程
2016/11/06 Python
python多进程实现文件下载传输功能
2018/07/28 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
Django多数据库联用实现方法解析
2020/11/12 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
使用HTML5在网页中嵌入音频和视频播放的基本方法
2016/02/22 HTML / CSS
工作失职检讨书范文
2014/01/16 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
班级体育活动总结
2014/07/05 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
安全生产标语口号
2015/12/26 职场文书