它是 D3 语言声明性的一部分。Thinking with Joins一文详细解释了它。摘录:
但是 selectAll("circle") 是怎么回事?为什么必须选择不存在的元素才能创建新元素?笏。
交易是这样的:与其告诉 D3 如何做某事,不如告诉 D3 你想要什么。在这种情况下,您希望圆元素与数据相对应:您希望每个基准一个圆。与其指示 D3 创建圆圈,不如告诉 D3 选择的“圆圈”应该与数据相对应,并描述如何到达那里。这个概念称为数据连接:
此维恩图说明了数据连接。绑定到现有元素的数据会产生更新(内部)选择。未绑定的数据产生输入选择(左),未绑定的元素产生退出选择(右)。Data Enter Update Elements Exit Thinking with joins 揭示了序列背后的奥秘:
selectAll("circle") 返回空选择,因为 SVG 容器元素 (svg) 为空。这里没有魔法。
空选择连接到数据:数据(数据)。data 方法将数据绑定到元素,产生三个虚拟选择:进入、更新和退出。输入选择包含任何缺失元素的占位符。更新选择包含绑定到数据的现有元素。任何剩余的元素最终都会出现在退出选择中以进行删除。
由于选择为空,所有数据最终都成为 enter() 中的占位符节点。
这与第一个示例中的附加相同,但应用于多个占位符;选择方法隐式迭代选定的元素。通过 append("circle") 将缺失的元素添加到 SVG 容器中。
就是这样了。您希望选择“圆圈”与数据相对应,并描述了如何创建缺失的元素。