如何使用 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 相关文章推荐
setTimeout和setInterval的深入理解
Nov 08 Javascript
JS事件在IE与FF中的区别详细解析
Nov 20 Javascript
jQuery实现判断滚动条到底部
Jun 23 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
Sep 15 Javascript
JavaScript iframe数据共享接口实现方法
Jan 06 Javascript
JS自定义混合Mixin函数示例
Nov 26 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
Mar 04 Javascript
JavaScript实现的商品抢购倒计时功能示例
Apr 17 Javascript
jQuery实现的页面弹幕效果【测试可用】
Aug 17 jQuery
Vue组件教程之Toast(Vue.extend 方式)详解
Jan 27 Javascript
elementUI Tree 树形控件的官方使用文档
Apr 25 Javascript
vue项目中将element-ui table表格写成组件的实现代码
Jun 12 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入门学习知识点三 PHP上传
2011/07/14 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
PHP整合PayPal支付
2015/06/11 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
QQ登录简单实现代码
2021/03/09 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
21个JavaScript事件(Events)属性汇总
2014/12/02 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
Python3里的super()和__class__使用介绍
2015/04/23 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
opencv 图像滤波(均值,方框,高斯,中值)
2020/07/08 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
公司庆典邀请函范文
2014/01/13 职场文书
公司前台辞职报告
2014/01/19 职场文书
工程技术员岗位职责
2014/03/02 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
公安机关起诉意见书
2015/05/20 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS
vscode中使用npm安装babel的方法
2021/08/02 Javascript
python套接字socket通信
2022/04/01 Python