在 d3 中,selection.select
具有从原始选择中的父节点继承数据的副作用。这在父节点和子节点之间共享数据的情况下是可取的,这样绑定到父节点的更新数据将被推送到子节点,而无需在每个级别进行数据连接。
但是对于绑定到父级的数据和绑定到子级的数据之间没有明确关系的情况呢?在这种情况下,selection.select
可能会很隐蔽,因为只需选择一个节点,就会导致该节点的数据被不相关的父数据破坏。
避免这种情况的最佳技术是什么?我可以想到几个选项,但似乎都不太好:
selection.selectAll
除了需要隐式数据继承的情况外,始终在任何地方使用。然而,这并不理想,因为它使用了selection.select
不一致的d3.select
方法来选择单个节点(这正是我想要做的selection.select
)。d3.select
与后代选择器一起使用,而不是selection.select
隔离特定节点。使用的方便selection.select
之处在于它隐式地将选择限制为起始选择的后代。使用选择器实现这一点并不是那么好。
就个人而言,我不喜欢在 API 中一些最常用的函数的一种特定形式中产生 DOM 状态修改副作用。我想我会发现如果有一个明确的调用,比如selection.update(selector)
与selection.append
and对称,我会更容易理解selection.insert
。
但是在当前的 API 中,我想知道是否有其他机制可以在使用时有效地打破继承selection.select
?