【发布时间】:2020-03-08 20:51:17
【问题描述】:
现在我正在使用自定义 Vue 库组件来生成带有 Pan/Zoom 的力图。节点的点击事件使用 Vue 的 @click 指令,但平移/缩放使用 D3 的 svg call(),所以这里有一个奇怪的 Vue 和 D3 混合。
问题是点击一个节点也触发了平移/缩放功能,这会中断点击事件并导致节点卡在拖动模式。现在,当加载图表时,所有节点都设置为停止事件传播,如下所示:
mounted () {
/* Panning currently blocks clicks, but this is bypassed by holding
a key while clicking. */
const svg = d3.select("svg")
this.zoom = d3.zoom()
.scaleExtent([1 / 4, 4])
.on('zoom', () => {
d3.select('.zLayer').attr("transform", d3.event.transform)
})
const node = d3.selectAll(".node").on("mousedown", () => {
d3.event.stopPropagation()
})
svg.call(this.zoom)
}
问题是,我的图表上的节点可以“扩展”,这会将新节点添加到 Vue 数据中,然后导致节点显示在图表上,但没有 d3.event.stopPropagation()。似乎没有一种独特的方式来调用它们,并且尝试选择所有节点并在它们上应用stopPropagation 实际上会为所有节点删除它。
如何让这些新节点停止同时激活平移/缩放,同时保留 Vue @click 功能?
【问题讨论】: