2017-12-06 7 views
1

私は、この反応コンポーネントがTextInputを参照していると言います。 私は次のように投げるの小道具を渡されると、しかし、私のレンダラは、要素の上に余分なものを持って、このコンポーネントはReact Dynamic Html Tags

<input type="text">と同様<textarea>が、それには何IFSと一緒にいたい:

render() { 
     return (
      <label> 
      <strong>{this.props.name}</strong> 
       <input type="text" ref={ component => { this.input = component; } } name={this.props.name} onChange={this.handleChange} value={this.state.value} /> 
      </label> 
    ) 
    } 

私のオリジナルのアイデアは、だから私の要素に、私は単に

としてこれをレンダリングするwoulこの

myInputProps = { type: (<input type="text"/>) } 

のようなものをやっていました0

{this.props.type} 

しかし、どのようにしてref、name、onchangeなどの要素にすべての余分なものを渡すことができますか?この問題にはどんな良いアプローチがありますか?いくつかのifsを実行して、コンポーネントの状態などに応じてレンダリングする必要があるかどうかを確認できますが、それがベストであるかどうかはわかりません。

+0

をわずか2つの異なるコンポーネント ''と ''を作成し、( 'type'が'とinputRef'などのような)小道具を渡します。どちらか、 'this.props.children'を使用してください。 –

+0

それは解決策ですが、私は可能な限り、より抽象的なものを試していました。 –

+0

なぜあなたはより抽象的になりたいですか? –

答えて

1

何が必要です:

render() { 
    var input = this.props.type; 
    input.props = { 
     ...input.props, 
     ref: (component) => { this.input = component;}, 
     onChange: this.handleChange, 
     value: this.state.value 
    }; 

    return (
     <label> 
      <strong>{this.props.name}</strong> 
      {input} 
     </label> 
) 
} 
+0

私はこのように 'input.props'を変更したがりますか?インスタンス上に 'props'を設定するのは不思議です。 –

+0

ええ、それは入力が外部から渡され、その小道具を変更したい場合にはそれが唯一の方法だと思われます。 –

+0

コメントの詳細を教えてください。私はあなたが言ったことを得られなかった。 –

0
render() { 
    return (
     <label> 
     <strong>{this.props.name}</strong> 
      {this.props.children} 
     </label> 
)} 
+0

'textarea'については? –

+0

私は答えを更新したので、それに応じて入力またはテキストエリアをラップすることができます –

0

私は別の<TextInput><TextArea>コンポーネントを使用して提唱していますが、本当にflexiblityが必要な場合は、小道具のレンダリングを使用したい:render小道具を使用して

を:

render() { 
     const props = { 
      ref: component => this.input = component, 
      name: this.props.name, 
      onChange: this.handleChange 
     }; 
     return (
      <label> 
      <strong>{this.props.name}</strong> 
       { this.props.render(props) } 
      </label> 
    ) 
    } 

それが好き:

<TextInput name="foo" render={ props => <input ...props /> } />