d3 js拖动事件侦听器没有收到事件-(d3,反应)

Posted

技术标签:

【中文标题】d3 js拖动事件侦听器没有收到事件-(d3,反应)【英文标题】:d3 js drag event listener isnt getting the event - (d3, react) 【发布时间】:2022-01-16 00:06:49 【问题描述】:

我正在尝试将拖动事件添加到我的 d3 强制布局中,但由于某种原因,未定义事件 attr,因此没有任何反应。我知道 d3-drag 的新文档发生了变化,我按照这些说明进行操作。

这是我的代码:

    const node = svg
      .selectAll("circle")
      .data(nodes)
      .enter()
      .append("circle")
      .attr("r", 35) // radius field, so width and height 80X80
      .attr("stroke", "lightgray")
      .attr("stroke-width", 0.5)
      .style("fill", "lightgray")
      .call(handler
      .on('start', dragstarted)
      .on('drag', dragged)
      .on('end', dragended)

事件函数:

    const dragstarted = (event: any, d: any) => 
      console.log(' dragged d', d);
      console.log('event', event);

      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
      // @ts-ignore
      if (!event.active) 
        simulation.alphaTarget(0.3).restart();
      
      d.fx = d.x;
      d.fy = d.y;
    

    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore
    const dragged = (event: any, d: any) => 
      console.log(' dragged d', d);
      console.log('event', event);

      d.fx = event.x;
      d.fy = event.y;
    

    // eslint-disable-next-line @typescript-eslint/ban-ts-comment
    // @ts-ignore
    const dragended = (event: any, d: any) => 
      console.log(' dragended  d', d);
      console.log('event', event);

      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
      // @ts-ignore
      if (event.active) 
        simulation.alphaTarget(0);
      

      d.fx = null;
      d.fy = null;
    

文档中的示例:

  d3.drag()
       .on("start", (event, d) => circle.filter(p => p === d).raise().attr("stroke", "black"))
       .on("drag", (event, d) => (d.x = event.x, d.y = event.y))
       .on("end", (event, d) => circle.filter(p => p === d).attr("stroke", null))

这就是我得到的:

Uncaught TypeError: Cannot read properties of undefined (reading 'document')
    at nodrag.js:5

我为未能获得事件的地方添加了屏幕截图

我不明白我在这里做错了什么,感谢您的帮助。

编辑 完整的代码示例: https://stackblitz.com/edit/react-saqrv9?file=src%2Fgraph.tsx

【问题讨论】:

您使用的是什么版本的 d3?如果您可以创建代码的minimal reproducible example,最好是在runnable stack snippet 中,这将大有帮助。这样,我们可以更轻松地回答您的问题,您也更有可能得到一个好的答案! 你是对的!这是当前代码的堆栈闪电战。 stackblitz.com/edit/react-saqrv9?file=src%2Fgraph.tsx 答案:解决问题): 【参考方案1】:

请注意,新 API 未使用 d3.event,而是将事件传递给事件侦听器。

为感兴趣的人更新了 sn-p,我知道那里没有很多例子,所以玩得开心

https://stackblitz.com/edit/react-saqrv9?file=src%2Fgraph.tsx

【讨论】:

以上是关于d3 js拖动事件侦听器没有收到事件-(d3,反应)的主要内容,如果未能解决你的问题,请参考以下文章

D3.js系列——交互式操作和布局

D3区分具有拖动行为的元素的单击和拖动

拖动事件后圆圈的Cx没有更新?

在 d3 中拖动后始终抑制单击事件

d3.js 过渡结束事件

d3交互