一尘不染

选择null:D3.js中“ selectAll(null)”背后的原因是什么?

javascript

我看过一些D3代码,它们带有类似这样的模式,用于附加元素:

var circles = svg.selectAll(null)
    .data(data)
    .enter()
    .append("circle");

我真的不明白这个片段。为什么选择null?我对D3的理解方式是,如果要添加圆,则应为:

var circles = svg.selectAll("circle")
    .data(data)
    .enter()
    .append("circle");

同样,如果要追加HTML段落,则应该为:

var circles = svg.selectAll("p")
    .data(data)
    .enter()
    .append("p");

类也是如此:如果将元素添加到类中foo,则应该为selectAll(".foo")

但是,selectAll(null) 确实有效!元素被追加。那么,这是什么意思null呢?我在这里想念什么?

注意:这是一个自我回答的问题,试图提供一个针对该主题的“规范”问答,该主题以前已被许多先前的问题所涉及而API 并未对此进行解释。下面的大多数答案来自我在绝种的StackOverflow文档中编写的示例。


阅读 421

收藏
2020-04-25

共1个答案

一尘不染

tl; dr

使用的目的selectAll(null)是确保“输入”选择始终对应于数据数组中的元素,对于数据中的每个元素都包含一个元素。

“输入”选择
要回答你的问题,我们必须简要解释一下D3.js中的“输入” 选择。你可能知道,D3的主要功能之一是将数据绑定到DOM元素的能力。

在D3.js中,当一种将数据绑定到DOM元素时,可能出现三种情况:

  1. 元素数和数据点数相同;
  2. 元素多于数据点;
  3. 数据点多于元素。

在情况#3中,所有没有相应DOM元素的数据点都属于“输入”选择。

因此,在D3.js中,“输入”选择是在将元素连接到数据之后包含与任何DOM元素都不匹配的所有数据的选择。如果在“输入”选项中使用附加函数,则D3将创建新元素,并为我们绑定该数据。

2020-04-25