2017-12-08 21 views
1

私はこの単純なコンポーネントコールバック関数でreduceを使用することはできますか?

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} /> 

ようにそれを使用しようとしている。しかし、私は

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

このような
onChange={(name, value) => self.reduce((_, _) => Change(name, value))} 

を定義するが、私は

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

を取得し、この時間は、あなたはそれを修正する方法のアイデアを持っていますか? reduceを別のコールバック関数の中に呼び出すことは可能ですか?

答えて

1

reduceは1-aryの機能を取り、1-aryの機能を返しますが、あなたのonChangeは2進関数であると予想されます。

定義:

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

アプリケーション:

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

、あなたがコントロールしていない場合は、この両方の側面を制御するように見えるので、最も簡単な修正は、単にタプルを使用することですどのようにコールバックが使われているのか、あなたは試したような別の関数でラップすることができますが、reduceは明示的に呼び出さなければならない関数を返します:

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

注:reduceによって返されたコールバックに渡す引数は、この場合だけ()には、reduceに渡さコールバックに渡される同じ引数です。しかしvalue => self.reduce(val => Action(val))(value)は、self.reduce(val => Action(val))を実行するのと同じです。

+0

素晴らしいですが、タプルについて考えなかった、ありがとう – ThomasThiebaud

関連する問題