什么是 D3 数据驱动文档

我们都习惯名称 D3.js ,它可能忘了 D3 实际上是 DDDd ata- d 里文 d ocuments)。这就是 D3 做得很好,DOM(文档对象模型)操作的数据驱动方法:D3 将数据绑定到 DOM 元素,并根据有界数据操作这些元素。

让我们看一下这个例子中 D3 的一个非常基本的特征。在这里,我们不会附加任何 SVG 元素。相反,我们将使用页面上已存在的 SVG,如下所示:

<svg width="400" height="400">
    <circle cx="50" cy="50" r="10"></circle>
    <circle cx="150" cy="50" r="10"></circle>
    <circle cx="210" cy="320" r="10"></circle>
    <circle cx="210" cy="30" r="10"></circle>
    <circle cx="180" cy="200" r="10"></circle>
</svg>

这是一个非常基本的 SVG,有 5 个圆圈。现在,这些圈子并没有绑定任何数据。我们来看看这最后的指控:

在我们的代码中,我们写道:

var svg = d3.select("svg");
var circles = svg.selectAll("circle");
console.log(circles.nodes());

在这里,d3.select("svg") 返回一个包含 <svg width="400" height="400"></svg> 标签的 d3 对象和所有子标签 <circle>s。请注意,如果页面上存在多个 svg 标签,则仅选择第一个。如果你不想这样,你也可以按标签 id 选择,比如 d3.select("#my-svg")。d3 对象具有内置的属性和方法,我们将在以后使用它们。

svg.selectAll("circle")<svg> 标签内的所有 <circle></circle> 元素创建一个对象。它可以搜索多个图层,因此标记是直接子图标并不重要。

circles.nodes() 返回带有所有属性的 circle 标签。

如果我们看一下控制台并选择第一个圆圈,我们会看到这样的东西:

https://i.stack.imgur.com/RHt5m.jpg

首先,我们有 attributes,然后是 childNodes,然后是 children,依此类推……但没有数据。

让我们绑定一些数据

但是,如果我们将数据绑定到这些 DOM 元素会发生什么?

在我们的代码中,有一个函数创建一个具有两个属性 xy 的对象,带有数值(此对象在数组中,请检查下面的小提琴)。如果我们将这些数据绑定到圈子……

circles.data(data);

如果我们检查控制台,我们将会看到这一点:

https://i.stack.imgur.com/jnHL4.jpg

我们在 attributes 之前有了新的东西! 一个名为 __data__ 的东西……看看:xy 的价值就在那里!

例如,我们可以根据这些数据更改圆圈的位置。看看这个小提琴

这就是 D3 最擅长的:将数据绑定到 DOM 元素并根据有界数据操作这些 DOM 元素。