5

在 ReasonML 中侦听/处理全局 DOM 事件的最惯用的方式是什么。

我正在构建 2048 游戏的 ReasonReact 版本,我需要在其中监听键盘事件。

在一个标准的 JS/React 应用程序中,我有一个带有componentDidMount生命周期方法的组件,我可以document.addEventListener("keypress", [my_event_handler])componentWillUnmount其中使用document.removeEventListener("keypress", [my_event_handler]).

在 Reason/ReasonReact 中访问 document.(addEventListener/removeEventListener) 的最惯用的方法是什么?

4

2 回答 2

6

你可以在 ReasonReact 中做几乎相同的事情——它支持didMountwillUnmount生命周期方法,它们对应于它们的 ReactJS 同名:https ://reasonml.github.io/reason-react/docs/en/lifecycles.html

要添加和删除事件监听器,可以使用@glennsl 的优秀 bs-webapi 包:https ://redex.github.io/package/bs-webapi

以下是添加和删除事件侦听器的一些示例:https ://github.com/reasonml-community/bs-webapi-incubator/blob/24cee2500b9c98355a14896fa9fc4ceb8a3e2258/tests/dom/events/eventTarget_test.re

把它们放在一起,你可以有一个像这样的组件:

/* src/components/MyComponent.re */
let document = Webapi.Dom.Document.asEventTarget(Webapi.Dom.document);
let handleKey = _ => Js.log("Key pressed");
let component = ReasonReact.statelessComponent("MyComponent");
let make = _children => {
  ...component,
  didMount: _self =>
    Webapi.Dom.EventTarget.addEventListener("keypress", handleKey, document),
  willUnmount: _self =>
    Webapi.Dom.EventTarget.removeEventListener("keypress", handleKey, document),
  render: _self => <p> (ReasonReact.string("Hello")) </p>,
};
于 2018-06-28T02:08:24.100 回答
1

我最终编写了自己的绑定到addEventListenerand removeEventListener

[@bs.val]
external add_keyboard_event_listener :
  (string, ReactEventRe.Keyboard.t => unit) => unit =
  "addEventListener";

[@bs.val]
external remove_keyboard_event_listener :
  (string, ReactEventRe.Keyboard.t => unit) => unit =
  "removeEventListener";
于 2018-06-28T23:24:36.123 回答