我看过一些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(".foo")
但是,selectAll(null) 确实有效!元素被追加。那么,这是什么意思null呢?我在这里想念什么?
selectAll(null)
注意:这是一个自我回答的问题,试图提供一个针对该主题的“规范”问答,该主题以前已被许多先前的问题所涉及而API 并未对此进行解释。下面的大多数答案来自我在绝种的StackOverflow文档中编写的示例。
tl; dr
使用的目的selectAll(null)是确保“输入”选择始终对应于数据数组中的元素,对于数据中的每个元素都包含一个元素。
“输入”选择 要回答你的问题,我们必须简要解释一下D3.js中的“输入” 选择。你可能知道,D3的主要功能之一是将数据绑定到DOM元素的能力。
在D3.js中,当一种将数据绑定到DOM元素时,可能出现三种情况:
在情况#3中,所有没有相应DOM元素的数据点都属于“输入”选择。
因此,在D3.js中,“输入”选择是在将元素连接到数据之后包含与任何DOM元素都不匹配的所有数据的选择。如果在“输入”选项中使用附加函数,则D3将创建新元素,并为我们绑定该数据。