如何使用 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 事件冒泡简介及应用
Jan 11 Javascript
jquery随意添加移除html的实现代码
Jun 21 Javascript
JS去除数组重复值的五种不同方法
Sep 06 Javascript
动态加载js的方法汇总
Feb 13 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
Oct 30 Javascript
JavaScript实现cookie的写入、读取、删除功能
Nov 05 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
May 07 Javascript
js字符串截取函数slice、substring和substr的比较
May 17 Javascript
js实现常用排序算法
Aug 09 Javascript
jQuery 生成svg矢量二维码
Aug 09 Javascript
js解决软键盘遮挡输入框的问题分享
Dec 19 Javascript
vue+axios全局添加请求头和参数操作
Jul 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性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
python+django加载静态网页模板解析
2017/12/12 Python
Python 修改列表中的元素方法
2018/06/26 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
anaconda如何查看并管理python环境
2019/07/05 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
光电信息专业应届生求职信
2013/10/07 职场文书
大学生社会实践自我鉴定
2014/03/24 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript