如何处理 ReasonML/ReasonReact 中的全局 DOM 事件?
How to handle global DOM events in ReasonML/ReasonReact?
ReasonML 中 listening/handling 全局 DOM 事件最惯用的方式是什么。
我正在构建 2048 游戏的 ReasonReact 版本,我需要在其中监听键盘事件。
在标准的 JS/React 应用程序中,我有一个带有 componentDidMount
生命周期方法的组件,我会在其中使用 document.addEventListener("keypress", [my_event_handler])
收听事件,并在 [=] 上取消收听相同的事件14=] 与 document.removeEventListener("keypress", [my_event_handler])
.
在 Reason/ReasonReact 中访问文档的最惯用方式是什么。(addEventListener/removeEventListener)?
你可以在 ReasonReact 中做几乎相同的事情——它支持 didMount
和 willUnmount
生命周期方法,对应于它们的 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>,
};
我最终编写了自己的绑定到 addEventListener
和 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";
ReasonML 中 listening/handling 全局 DOM 事件最惯用的方式是什么。
我正在构建 2048 游戏的 ReasonReact 版本,我需要在其中监听键盘事件。
在标准的 JS/React 应用程序中,我有一个带有 componentDidMount
生命周期方法的组件,我会在其中使用 document.addEventListener("keypress", [my_event_handler])
收听事件,并在 [=] 上取消收听相同的事件14=] 与 document.removeEventListener("keypress", [my_event_handler])
.
在 Reason/ReasonReact 中访问文档的最惯用方式是什么。(addEventListener/removeEventListener)?
你可以在 ReasonReact 中做几乎相同的事情——它支持 didMount
和 willUnmount
生命周期方法,对应于它们的 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>,
};
我最终编写了自己的绑定到 addEventListener
和 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";