可拖动的反应 div:指数运动

Posted

技术标签:

【中文标题】可拖动的反应 div:指数运动【英文标题】:draggable react divs: exponential movement 【发布时间】:2020-07-26 00:06:19 【问题描述】:

我正在尝试在 React 中创建一个可拖动的组件来跟踪鼠标指针的路径,但是该组件正在呈指数级移动。 Working demo here

我的设置如下所示:

Blocks:作为可拖动组件的持有者(下图中的灰色)

Block:这是可拖动的组件(下图中的粉红色) 我将 Block 的初始位置设置为 left:0, top:0 ,然后根据鼠标拖动更改位置。 这是更新位置的逻辑:

点击粉色方块后,我触发了 onMouseDown 事件:

// function to handle mouse down
  mouseDown = (e) =>
    this.setState(originalX:e.clientX, originalY:e.clientY);
    window.addEventListener("mousemove",this.moving);
    window.addEventListener('mouseup', this.mouseUp);
  

设置 originalX, originalY 来跟踪触发点击事件的原始位置。这用于计算位置的增量并相应地更新 left 和 top 属性

这是我的鼠标移动的样子:

 // function to handle mouse move
  moving = (clientX, clientY)=>

    this.setState((prevState)=>
       return 
         style:
           left:(this.state.left+(clientX - this.state.originalX))+"px" ,
           top: (this.state.top+(clientY - this.state.originalY))+"px"
          ,
          left:this.state.left+(clientX - this.state.originalX),
          top: this.state.top+(clientY - this.state.originalY)
          ;
      );
  

我在这里将 this.state.style.left 设置为 (this.state.left+(clientX - this.state.originalX))+"px" this.state.left 表示传递给组件的初始位置(在本例中为 0)。 Baiscally,我将位置 (clientX - this.state.originalX) 的变化添加到初始位置。此外,我将此计算存储在 this.state.left 中以供将来更新。属性 top 也是如此。

理想情况下,这应该在我拖动时跟踪鼠标指针,但移动似乎是指数级的。我尽力调试,但无法找出问题所在。如果有人可以在这里提供帮助,不胜感激。

【问题讨论】:

【参考方案1】:

我做了一些挖掘并发现了问题。我应该将左右属性的状态更新移动到 mouseUp 函数。以下是我修改这两个函数的方法:

  moving = (clientX, clientY, target)=>

    this.setState((prevState)=>
       return 
         style:
           left:(this.state.left+(clientX - this.state.originalX))+"px" ,
           top: (this.state.top+(clientY - this.state.originalY))+"px"
          
          ;
      );
  

  mouseUp = (clientX,clientY) => 
    window.removeEventListener("mousemove",this.moving);
    window.removeEventListener("mouseup",this.mouseUp);

    this.setState(
      left:(this.state.left+(clientX - this.state.originalX)),
      top:(this.state.top+(clientY - this.state.originalY))
    )

  

【讨论】:

以上是关于可拖动的反应 div:指数运动的主要内容,如果未能解决你的问题,请参考以下文章

JQueryUI-拖动(Draggable)-约束运动

动态调整视图大小(拖动运动)时自动布局约束中断

JQueryUI-拖动(Draggable)-在DOM 元素中约束运动

不再需要传统物理理论,机器学习可直接准确预测行星运动

将 <li> 附加到 <ul> 但不能成为可拖动的 jQuery [重复]

JS运动应用