D3.js入门之D3 DataJoin的使用

 更新时间:2022年11月08日 09:18:05   作者:FinGet  
DataJoin(数据连接)是D3中很重要的一个概念。D3是基于数据操作DOM的js库,DataJoin使我们能够根据现有 HTML 文档中的数据集注入、修改和删除元素。本文主要和大家详细聊聊DataJoin的使用,感兴趣的可以学习一下

DataJoin(数据连接)是D3中很重要的一个概念。上一章有提到D3是基于数据操作DOM的js库,DataJoin使我们能够根据现有 HTML 文档中的数据集注入、修改和删除元素。

上一章中我们用forEach循环的方式,画了三个圆,那么在D3中该怎样优雅的处理呢?

const circles = [
    { text: 1, color: "red" },
    { text: 2, color: "green" },
    { text: 3, color: "blue" }
];

svg.selectAll("circle")
    .data(circles) // 绑定数据
    .enter() // 获取有数据没dom的集合
    .append("circle")
    .attr("class", "circle")
    .attr("id", (d) => `circle${d.text}`) // d 表示 data绑定的数据中的一项
    .attr("cx", (d) => 50 * d.text)
    .attr("cy", 50)
    .attr("r", 20)
    .attr("fill", (d) => d.color);

data、enter、exit

  • data 将指定数组的数据 data 与已经选中的元素进行绑定并返回一个新的选择集和enter 和 exit
  • enter 返回选择集中有数据但没有对应的DOM元素
  • exit 选择集中有DOM元素但没有对应的数据

<div id="dataEnter">
    <p></p>
    <p></p>
    <p></p>
    <p></p>
    <p></p>
</div>
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];

const update = d3.select("#dataEnter")
  .selectAll("p")
  .data(arr)
  .text((d) => d);

因为有5个p标签,所以从1开始渲染到5。

enter返回的是有数据没有dom的集合,也就是数据比dom多,所以enterappend基本上都是成对出现的。

d3.select("#dataEnter")
  .selectAll("p")
  .data(arr)
  .enter()
  .append("p")
  .text((d) => d);

exit返回的是有dom没有数据的集合,也就是dom比数据多,所以exitremove基本上也是成对出现的。

const arr = [1,2,3]

d3.select("#dataEnter")
  .selectAll("p")
  .data(arr)
  .text((d) => d)
  .exit()
  .remove();

点击查看data, enter, exit示例

datum

如果datum()绑定的值是数组,那么整个数组会绑定到每个被选择的元素上。

而使用data()的话,那么会依次绑定数据。

const datumDom = d3.select("#datum")
    .selectAll("p")
    .datum(circles)
    .text((d) => {
        console.log(d);
        return JSON.stringify(d);
    });

selection.datum().append()如果选择集是空的,那么并不会添加元素,所以使用datum要确保选择项(dom)存在。实际项目中,图表都是从0到1绘制,所以一般都是使用data().append()

join

const arr = [1, 2, 3];

svg.selectAll("circle")
    .data(arr)
    .join("circle")
    .attr("cx", (d) => d * 50)
    .attr("cy", (d) => d * 50)
    .attr("r", 16)
    .attr("fill", "#F89301");

join 根据需要追加、删除和重新排列元素,以匹配先前通过选择绑定的数据,返回合并后的enter和update集合。

也就是说join是一个简化操作,我们可以把join分解一下:

const circle = svg.selectAll("circle").data(arr);

const newCircle = circle.enter()
    .append("circle")
    .merge(circle)
    .attr("cx", (d) => d * 50)
    .attr("cy", (d) => d * 50)
    .attr("r", 16)
    .attr("fill", "#F89301");

最后

这里有一个示例动态的显示了enter(绿色)update(灰色)exit(红色)效果:

点击查看 join 示例

以上就是D3.js入门之D3 DataJoin的使用的详细内容,更多关于D3.js DataJoin的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript动态设置div的样式的方法

    JavaScript动态设置div的样式的方法

    这篇文章主要介绍了JavaScript动态设置div的样式的方法的相关资料,需要的朋友可以参考下
    2015-12-12
  • layui lay-verify form表单自定义验证规则详解

    layui lay-verify form表单自定义验证规则详解

    今天小编就为大家分享一篇layui lay-verify form表单自定义验证规则详解,具有很好的参考价值,相信我对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • JS获取计算机mac地址以及IP的实现方法

    JS获取计算机mac地址以及IP的实现方法

    本篇文章主要是对利用JS获取计算机mac地址以及IP的实现方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • Bootstrap中data-target 到底是什么

    Bootstrap中data-target 到底是什么

    这篇文章主要介绍了Bootstrap中data-target 到底是什么的相关资料,我目前理解到在bootstrap中data-target,data-toggle等属性主要有两种作用,具体哪两种作用,大家通过本文详细了解下
    2017-02-02
  • TypeScript泛型参数默认类型和新的strict编译选项

    TypeScript泛型参数默认类型和新的strict编译选项

    这篇文章主要介绍了TypeScript泛型参数默认类型和新的strict编译选项,对TypeScript感兴趣的同学,可以参考下
    2021-05-05
  • Dom 学习总结以及实例的使用介绍

    Dom 学习总结以及实例的使用介绍

    本篇文章小编为大家介绍,Dom 学习总结以及实例的使用。需要的朋友参考下
    2013-04-04
  • js中async函数结合promise的小案例浅析

    js中async函数结合promise的小案例浅析

    这篇文章主要介绍了js中async函数结合promise的小案例浅析,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • js实现简单的碰壁反弹效果

    js实现简单的碰壁反弹效果

    这篇文章主要为大家详细介绍了js实现简单的碰壁反弹效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 深入了解JavaScript发布订阅模式

    深入了解JavaScript发布订阅模式

    JavaScript 发布订阅模式(Publish/Subscribe Pattern)是一种常用的设计模式,发布订阅模式的核心思想是解耦事件的发生和事件的处理,本文将介绍 JavaScript 发布订阅模式的基本原理、应用场景以及各场景的代码示例,需要的朋友可以参考下
    2023-05-05
  • 在JavaScript中实现链式调用的实现

    在JavaScript中实现链式调用的实现

    这篇文章主要介绍了在JavaScript中实现链式调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论