无法从ReasonReact中的事件侦听器获取事件数据

荷曼

我正在尝试在表格上实现动态列大小调整(例如在Excel或Google表格中)。

handle当用户在我的调整大小控件上单击鼠标时,在渲染函数中使用回调:

 <div
     className="resizer"
     onMouseDown={self.handle(handleColumnResizeStart)}
 />

在处理程序中,我想为mousemove添加一个新的事件侦听器,以便在用户“拖动”时可以绘制一些内容以指示新列边缘将在何处结束。

在mousemove处理程序中,我想我可以发送一个包含鼠标clientX坐标的reducer操作来更新组件状态,以便render函数在拖动时可以绘制一些内容。

let handleColumnResizeStart = (evt, self) => {
  /* this handler gets invoked when the mouse is moved */
  let handleMouseMove = evt => {

    Js.log(evt); /* in js land I can see that clientX is in that evt object */
    Js.log(ReactEvent.Mouse.clientX(evt)); /* but this creates type errors */


  };
  /* adds an event handler using the bs-webapi module */
  Webapi.Dom.EventTarget.addEventListener(
    "mousemove",
    handleMouseMove,
    document,
  );

};

当我尝试用于ReactEvent.Mouse.clientX(evt)获取clientX的特定int值时,出现以下错误:

  25 Webapi.Dom.EventTarget.removeEventListener(
  26 ┆   "mousemove",
  27 ┆   handleMouseMove,
  28 ┆   document,
  29 ┆ );

  This has type:
    ReactEvent.Mouse.t => unit
  But somewhere wanted:
    Dom.event => unit

  The incompatible parts:
    ReactEvent.Mouse.t (defined as
      ReactEvent.synthetic(ReactEvent.Mouse.tag))
    vs
    Dom.event (defined as Dom.event_like(Dom._baseClass))

>>>> Finish compiling(exit: 1)

我对类型系统的了解仅限于此,我不确定如何将鼠标clientX坐标的值转换为变量。

格伦斯

尽管从React和直接附加到DOM的事件处理程序接收的事件看起来很相似,但实际上它们是不同的。React不会给您一个原始的DOM事件,而是一个SyntheticEvent,因此,由于某种原因,它们被赋予了不同的类型,这就是类型错误通知您的原因。您不能Dom.eventReactEvent.Mouse.t预期使用a的地方使用在这种情况下evt为a Dom.event,因为它是通过使用将事件处理程序直接附加到DOM来获取的bs-webapi,并且ReactEvent.Mouse.clientX当然需要a ReactEvent.Mouse.t

因此ReactEvent.Mouse.clientX,您应该使用而不是使用Webapi.Dom.MouseEvent.clientX

不幸的是,这仍然不起作用,因为Webapi.Dom.MouseEvent.clientX期望aDom.mouseEvent而不是a Dom.event,它是所有DOM事件类型的超类型,并且过于笼统而无法与特定于鼠标事件的功能一起使用。这又是因为Webapi.Dom.EventTarget.addEventLsitener无法理解,这"mousemove"意味着这是鼠标事件。您应该改用Webapi.Dom.EventTarget.addMouseMoveEventListener,它确实会给您带来收益Dom.mouseEvent

请注意,您得到的类型错误比它需要的更加混乱,因为它会推断出类型并指向错误,而不是您认为错误源于何处。注释类型是一个好主意,至少在遇到难以理解的类型错误时。这样,编译器将不会推断出您不希望的类型,并且将包含错误的起因。

您可能还想使用Webapi.Dom.Document而不是Webapi.Dom.EventTargetDocument继承了中的所有内容EventTarget,但同时会记录和约束您所操作的类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章