全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

d3.js入门教程之数据绑定详解

前言

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元素的创建开始(显示可加载数据)  # 出现在  # 是一个  # 绑定  # 多个  # 你已经  # 新和  # 都是  # 包含了  # 在这个  # 你可以  # 让我们  # 你会  # 是这样  # 之处  # 只需  # 要在  # 这份  # 要用  # 不存在  # 在特定 


相关文章: 广德云建站网站建设方案与建站流程优化指南  如何在万网主机上快速搭建网站?  建站之星价格显示格式升级,你的预算足够吗?  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何快速搭建二级域名独立网站?  如何选择高效稳定的ISP建站解决方案?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  网站制作壁纸教程视频,电脑壁纸网站?  如何自定义建站之星模板颜色并下载新样式?  音响网站制作视频教程,隆霸音响官方网站?  如何快速辨别茅台真假?关键步骤解析  如何通过云梦建站系统实现SEO快速优化?  建站之星云端配置指南:模板选择与SEO优化一键生成  如何在IIS中新建站点并解决端口绑定冲突?  如何通过主机屋免费建站教程十分钟搭建网站?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  高端建站三要素:定制模板、企业官网与响应式设计优化  建站之星安装失败:服务器环境不兼容?  如何选择美橙互联多站合一建站方案?  如何选择建站程序?包含哪些必备功能与类型?  制作证书网站有哪些,全国城建培训中心证书查询官网?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何挑选优质建站一级代理提升网站排名?  如何高效搭建专业期货交易平台网站?  如何彻底卸载建站之星软件?  如何在云主机快速搭建网站站点?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何制作算命网站,怎么注册算命网站?  如何选择CMS系统实现快速建站与SEO优化?  如何快速生成橙子建站落地页链接?  如何通过IIS搭建网站并配置访问权限?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  智能起名网站制作软件有哪些,制作logo的软件?  如何在阿里云购买域名并搭建网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  建站之星安装后如何自定义网站颜色与字体?  高端云建站费用究竟需要多少预算?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  常州自助建站费用包含哪些项目?  高防服务器:AI智能防御DDoS攻击与数据安全保障  太平洋网站制作公司,网络用语太平洋是什么意思?  济南专业网站制作公司,济南信息工程学校怎么样?  活动邀请函制作网站有哪些,活动邀请函文案?  济南网站建设制作公司,室内设计网站一般都有哪些功能? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。