2017-07-19 4 views
0

recomposeこの関数はwithHandlersと呼ばれ、コンポーネントを純粋に保ちながらイベントハンドラを定義することができます。RecomposeのwithHandlers()にコンテキストを追加するにはどうすればよいですか?

あなたはrender()メソッド内でこのようなものを持っていた場合:たびに、あなたのコンポーネントがレンダリングので

<TextInput value={value} onChange={ev => this.handleChange(ev.target.value)} /> 

それはあなたのTextInputコンポーネントに異なるonChange機能を渡すことで、それがしたい、純粋ではないでしょう。

これは素晴らしいですが、入力の配列をサポートするためにこれをどのように拡張できますか?そうでなければ補助データを提供しますか?

その一例を取って、それを少し拡張:

const enhance = compose(
    withState('values', 'updateValue', ''), 
    withHandlers({ 
     onChange: props => inputName => event => { 
      props.updateValue(inputName, event.target.value) 
     }, 
     onSubmit: props => event => { 
      event.preventDefault(); 
      submitForm(props.value) 
     } 
    }) 
) 

const Form = enhance(({ value, onChange, onSubmit, inputs }) => 
    <form onSubmit={onSubmit}> 
     <label>Value 
      {inputs.map(input => (
       <TextInput value={value} onChange={onChange(input)} />  
      ))} 
     </label> 
    </form> 
) 

私は詳細を少しfudgedが、inputsは、入力名の配列として入ってくるふりをしました。例えば["firstName","lastName"]は2つのテキストボックスを1つずつレンダリングします。

それぞれの値を自分の状態に保存したいのですが、それぞれに個別のアップデータ機能を定義したくありません。したがって、私は自分の状態で更新しているフィールドを知るために、onChange={...}小道具にいくつかのメタデータを添付する必要があります。

どうすればいいですか?

は私の例では、私はonChange(input)を書いて、追加の引数を受け入れるようにwithHandlers.onChange関数に余分な「レベル」を追加しましたが、実際にそのようにwithHandlers動作しません。これを行うにはいくつかの方法がありますか?つまり、<Form>がレンダリングされるたびに、それぞれのTextInputが同じ関数インスタンスを受け取るようにしますか?

答えて

1

これは、TextInputコンポーネント内で直接変更ハンドルを定義する必要がある典型的なケースです。 updateValue関数をTextInputコンポーネントの小道具として渡す必要があります。

+0

Oh ..そして、別の小道具として入力名を 'TextInput'に渡しますか?私はうまくいくかもしれないと思うが、それはそのようなシナリオを処理できるようにすべての入力コンポーネントを変更する必要がある。 – mpen

+0

はい。この方法:https://codesandbox.io/s/jRDqrErmz – Lansett

+0

すばらしい例!有難うございます。 – mpen

関連する問題