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は 1 項関数を取り、1 項関数を返しますが、あなたonChangeは 2 項関数であることが期待されています。これの両側を制御しているように見えるので、最も簡単な修正はタプルを使用することです:

意味:

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 に答える