1

我有这个简单的组件

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在另一个回调函数中调用?

4

1 回答 1

1

reduce接受一个一元函数并返回一个一元函数,但您onChange应该是一个二元函数。由于您似乎控制了这一切,最简单的解决方法是只使用一个元组:

定义:

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

应用:

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

或者,如果你不控制回调的使用方式,你可以像你尝试的那样将它包装在另一个函数中,但是由于reduce返回一个函数,你必须显式调用它:

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

注意:您传递给由返回的回调 reduce的参数与将传递给传递给的回调 reduce的参数相同,在本例中为(). 但value => self.reduce(val => Action(val))(value)因此相当于只是做self.reduce(val => Action(val))

于 2017-12-08T09:27:44.263 回答