2017-12-08 6 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} /> 

처럼 사용하려고 해요하지만이 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={(name, value) => self.reduce((_, _) => Change(name, value))} 

같은 onChange를 정의하지만,이 시간이 나는

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

을 어떻게 그것을 해결하는 아이디어를 가지고 있지? reduce을 다른 콜백 함수로 호출 할 수 있습니까?

답변

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))()} 
onChange={(name, value) => self.reduce(() => Change(name, value))()} 

참고 : reduce에 의해 반환되는 콜백에 전달하는 인수는이 경우 단지 ()에,reduce에 전달 콜백에 전달 될 것 같은 인수입니다. 그러나 value => self.reduce(val => Action(val))(value)은 따라서 self.reduce(val => Action(val))을 수행하는 것과 같습니다.

+0

굉장하고, 튜플에 대해 생각하지 않았습니다. 감사합니다. – ThomasThiebaud

관련 문제