是否可以在回调函数中使用reduce?

时间:2017-12-08 07:41:06

标签: reason reason-react

我有这个简单的组件

let component = ReasonReact.statelessComponent("Input");

let make = (~name, ~onChange, ~value, _children) => {
    ...component,
    render: (_self) =>
        <input
            name=name
            onChange={(_) => {
              onChange(name, "change")
            }}
            value=value />
};

我试图像这样使用它

<Input
    name="
    placeholder="Your email"
    onChange={self.reduce((name, value) => Change(name, value))}
    label=""
    value={self.state.email} />

但我在onChange

上收到此错误
This is:
    ReasonReact.Callback.t(string) (defined as (string) => unit)
  But somewhere wanted:
    (string, string) => unit

  The incompatible parts:
    unit
    vs
    (string) => unit

我想我理解错误,但我不知道要解决它。我还要像这样定义onChange

onChange={(name, value) => self.reduce((_, _) => Change(name, value))}

但是这次我得到了

This is:
    ReasonReact.Callback.t('a) (defined as ('a) => unit)
  But somewhere wanted:
    unit

你知道如何解决它吗?是否可以在另一个回调函数中调用reduce

1 个答案:

答案 0 :(得分:1)

reduce采用1-ary函数并返回1-ary函数,但您的onChange应该是2-ary函数。既然您似乎控制了这两方面,最简单的解决方法就是使用元组:

定义:

onChange={self.reduce(((name, value)) => Change(name, value))}

应用:

onChange={(_) => {
  onChange((name, "change"))
}}

或者,如果您不控制回调的使用方式,您可以将其包装在您尝试的其他函数中,但由于reduce返回一个函数,您必须明确地调用它:

onChange={(name, value) => self.reduce(() => Change(name, value))()}

注意:传递给 reduce返回的回调的参数与将传递给传递给 {{1}的回调的参数相同},在这种情况下只是reduce。但()因此只相当于value => self.reduce(val => Action(val))(value)