想象一下,我的代码中有以下调用:
svg.selectAll("path")
.data(data, key)
.enter().append("path")
.attr("d", path);
稍后在代码中,进行完全相同的调用,仅data
包含一些新条目。如何在不重绘现有路径的情况下将新数据条目绑定到新路径?(即与现有路径关联的数据元素永远不会改变)
这是一项性能优化:data
包含 10,000 多个条目,每次调用添加或删除的条目不到 1%。正如您可能想象的那样,绘制 10,000 多个路径非常耗费资源并且需要几秒钟的时间(在此期间整个页面对用户事件没有响应)。
一种解决方案是构建一个包含旧数据和新数据之间差异的数组,并enter()
仅用于新数据元素。但是,data
在提供第二个数据集时将旧变量包含在范围内是很棘手的。我认为 D3 必须以某种方式在内部维护旧数据的表示,当然我们可以使用它。
类似地,对于已删除的数据元素必须执行相同的过程(每次调用都会删除一些元素,data
并且必须从 DOM 中删除相应的路径,而不涉及所有其他路径)。但是,我想我可以在第一部分给出解决方案的情况下弄清楚这部分。