我希望将事件处理程序从父级传递到子级,并将一系列组件向下传递。以下是一个工作示例:
索引
ReactDOMRe.renderToElementWithId(
<App myHandler={_evt => Js.log("my handler clicked")} />,
"root",
);
App.re
let component = ReasonReact.statelessComponent(__MODULE__);
let make = (~myHandler, _children) => {
...component,
render: _self => <MyComponent myHandler />,
};
MyComponent.re
let component = ReasonReact.statelessComponent(__MODULE__);
let make = (~myHandler, _children) => {
...component,
render: _self =>
<div onClick=myHandler> {ReasonReact.string("click me")} </div>,
}
正如现在的代码一样
myHandler
This call is missing an argument of type (~myHandler: ReactEvent.Mouse.t => unit)
通过添加
=?
在函数声明中,如下所示:
let component = ReasonReact.statelessComponent(__MODULE__);
let make = (~myHandler=?, _children) => {
...component,
render: _self =>
<div onClick=myHandler> {ReasonReact.string("click me")} </div>,
};
但是,这会产生编译错误:
5 â ...component,
6 â render: _self =>
7 â <div onClick=myHandler> {ReasonReact.string("click me")} </div>,
8 â };
This has type:
option('a)
But somewhere wanted:
ReactEvent.Mouse.t => unit
我想也许编译器需要一个提示。然后我尝试将该类型显式添加到函数声明中,如下所示:
let component = ReasonReact.statelessComponent(__MODULE__);
let make = (~myHandler: ReactEvent.Mouse.t => unit=?, _children) => {
...component,
render: _self =>
<div onClick=myHandler> {ReasonReact.string("click me")} </div>,
};
但我突然意识到这个错误,并告诉我:
4 â let make = (~myHandler: ReactEvent.Mouse.t => unit=?, _children) => {
5 â ...component,
6 â render: _self =>
This pattern matches values of type
ReactEvent.Mouse.t => unit
but a pattern was expected which matches values of type
option('a)
现在我都糊涂了。