d3.js入门教程之数据绑定详解
发布时间 - 2026-01-11 00:53:00 点击率:次前言

d3.js 是一款上手容易的js类库,专门用于绘制svg图形图表,其关键理念为data-join 意即数据绑定.搞清这个概念非常重要,它将以简洁优雅的形式体现数据驱动编程.
以下是Thinking with Joins的拙译 ,原作者Mike Bostock
假设你要用D3画一副散点图,因此需要生成一些 SVG circle 元素来直观地展现数据. 你会惊讶地发现D3没有提供原生的产生多个DOM元素的接口,
是的,只有一个 append 方法,用于产生单个DOM元素:
svg.append("circle")
.attr("cx", d.x)
.attr("cy", d.y)
.attr("r", 2.5);
但那只是单个圆,而你想要更多: 最好data*中每个元素对应一个圆. 在你用蛮力写循环把圆画出来之前,让我们看看D3中的一个例子:
svg.selectAll("circle")
.data(data)
.enter().append("circle")
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", 2.5);
*此处 data是一个 JSON 数组,其每个元素 由 x 和 y属性构成, 例如: [{"x": 1.0, "y":1.1},{"x": 2.0, "y":2.5}, …]. 另,SVG circle元素用cx,cy表达圆心坐标,r表达半径长度.
这份代码符合你的需求,即每个元素产生一个圆 , 通过x和y属性表达圆心的坐标.
但selectAll("circle")是什么意思,为什么要在产生所有圆之前去选中根本不存在的元素呢?
原来事情是这样的:告诉D3你的目标,而不要告诉它具体怎么做. 在这个例子中,D3知道我们的意图是,要让选中的"circle"元素来响应数据的变化, selectAll即描述了这个目标;而无需一步步指挥D3产生多个圆.这个概念即data-join.
data-join的背后执行了以下步骤:
selectAll("circle")返回了一个空的选择- 空的选择通过 data()方法将数据和DOM元素绑定,并产生三个虚拟的子集: enter, update and exit. enter()方法包含了待添加的数据及相应的DOM元素的占位符;update()包含了已与数据绑定的现有元素.剩下待移除的部分被包含在 exit ()方法中
- 一开始选择的结果是空的,因此所有数据都是待添加,将全部出现在enter的结果中.
- 无需循环,通过
.enter().append("circle")将待添加的元素一次性加入到SVG容器.
为什么要这么麻烦呢? 为什么不直接提供原生接口? data-join的优雅之处在于抽象和解耦.上述代码在enter()里只是专心处理新增的元素,而update and exit分别专注于处理更新和待删除部分.这意味着你不用把所有DOM元素删了重绘,因此得以轻松应对实时变化的数据,甚至支持一些交互(如拖动)与渐变的效果!
这里是一个处理三种状态(增改删)的例子:
var circle = svg.selectAll("circle")
.data(data);
circle.enter().append("circle")
.attr("r", 2.5);
circle
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
circle.exit().remove();
如果我们重复运行代码,它会每次重新计算 data-join. 如果新的数据集比原来的少,多余元素会出现在 exit 中并被remove()删除.反之亦然,新增的数据出现在enter()中通过append()添加DOM元素.若新老数据集大小不变,则所有数据只是更新坐标.(译注:上文中介于enter和exit之间的代码,update()会被隐式调用)
以joins的方式思考同时让你的代码更直观: 处理这三种状态的代码无需条件(if)和循环(for)分支,只需简单描述让图形去响应数据的变化即可.如果给定的enter, update 或 exit 的选择结果为空,则会自动跳过相应的代码块,以降低性能开销.
Joins 支持在特定状态(增/删/改)下执行操作.例如,可以在enter而非update代码块中,指定静态的attributes(例如圆的半径,用 "r" attribute指定) . 仰赖于精确改动目标元素和最小化DOM变更,你已经极大地提升了浏览器渲染的表现! 类似地,你可以在特定状态下表现渐变等动画效果. 例如新增的圆可以从无到有渐变(半径从0到2.5):
circle.enter().append("circle")
.attr("r", 0)
.transition()
.attr("r", 2.5);
待删除的圆也可以逐渐收缩直至消失:
circle.exit().transition()
.attr("r", 0)
.remove();
相信现在你已经学会用joins的方式思考了!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# d3.js
# 动态数据
# d3.js地图展示数据
# 读取数据库
# JavaScript可视化图表库D3.js API中文参考
# D3.js实现折线图的方法详解
# D3.js实现柱状图的方法详解
# 基于d3.js实现实时刷新的折线图
# d3.js实现简单的网络拓扑图实例代码
# D3.js实现饼状图的方法详解
# D3.js 从P元素的创建开始(显示可加载数据)
# 出现在
# 是一个
# 绑定
# 多个
# 你已经
# 新和
# 都是
# 包含了
# 在这个
# 你可以
# 让我们
# 你会
# 是这样
# 之处
# 只需
# 要在
# 这份
# 要用
# 不存在
# 在特定
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
php结合redis实现高并发下的抢购、秒杀功能的实例
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
昵图网官方站入口 昵图网素材图库官网入口
PHP 500报错的快速解决方法
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
如何破解联通资金短缺导致的基站建设难题?
如何在香港免费服务器上快速搭建网站?
用yum安装MySQLdb模块的步骤方法
如何在企业微信快速生成手机电脑官网?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
如何用PHP工具快速搭建高效网站?
大同网页,大同瑞慈医院官网?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
免费网站制作appp,免费制作app哪个平台好?
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
实例解析angularjs的filter过滤器
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
再谈Python中的字符串与字符编码(推荐)
昵图网官网入口 昵图网素材平台官方入口
高端网站建设与定制开发一站式解决方案 中企动力
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
如何用AWS免费套餐快速搭建高效网站?
Laravel如何使用模型观察者?(Observer代码示例)
如何在阿里云虚拟主机上快速搭建个人网站?
Java类加载基本过程详细介绍
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
如何挑选最适合建站的高性能VPS主机?
PythonWeb开发入门教程_Flask快速构建Web应用
如何在宝塔面板中创建新站点?
奇安信“盘古石”团队突破 iOS 26.1 提权
如何快速完成中国万网建站详细流程?
Python结构化数据采集_字段抽取解析【教程】
高端企业智能建站程序:SEO优化与响应式模板定制开发
Laravel API资源类怎么用_Laravel API Resource数据转换
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何挑选优质建站一级代理提升网站排名?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
Laravel怎么实现验证码(Captcha)功能
Swift中switch语句区间和元组模式匹配
Java遍历集合的三种方式
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel Session怎么存储_Laravel Session驱动配置详解
如何打造高效商业网站?建站目的决定转化率
JS碰撞运动实现方法详解
Bootstrap整体框架之CSS12栅格系统
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】

