2017-08-14 23 views
0

選択したオプションに基づいて新しいテキスト入力を表示しようとしています。私は以下のようにそれを行うことができますが、私が新しい選択オプションをどのように変更しても、入力された古い値は常に存在します。React:選択したオプションのテキスト入力ベースの追加/変更

これを達成するにはどうすればよいでしょうか?提案を感謝してください。

class loadComponent extends React.Component { 
    static propTypes = { 
     ...... 
    }; 
    static defaultProps = { 
    .... 
    }; 
    constructor() { 
    super(); 
    this.state = { 
     value: "" 
    }; 
    } 
    state = { 
     ... 
    }; 

reset = (selected) => { 
     this.setState({ 
     selectedInputName: selected.target[selected.target.selectedIndex].text, 
     selectedInputId: selected.target.value 
     }); 
}; 

makeTextInput =() => { 
    return (
     <TextInput 
      label={this.state.selectedInputName} 
      placeholder={`Please enter ${this.state.selectedInputName} here!`} 
      onBlur={event => this.setState({[this.state.selectedInputId]: event.target.value})} 
      showClear 
      value={this.state.value} 
     /> 
    ); 
}; 
render() { 
    let newInputText = ''; 
    if (this.state.selectedInputId !== '') { 
     newInputText = this.makeTextInput(); 
    } 
    return (
     <Select 
      label="What would you like to search with?" 
      options={this.props.searchOptions} 
      onChange={selected => this.reset(selected)} 
     /> 
     <div className="search margin_bottom_large"> 
      {newInputText} 
    ); 
+0

そう基本的には、入力タイプが変更されたときにユーザーからの現在の入力をクリアしますか? –

+0

@canaanseatonええ、それはまさに私が達成しようとしていることです。 – Shrav

+0

大丈夫、下の私の解決策を見てください。そのようなことをすると、いつでも入力の値がリセットされます。たとえば、入力の種類が変わったときなどです。 –

答えて

1

makeTextInput関数は、新しいオブジェクトを作成しますが、reactは彼らのtypekeyを見て、それらを区別するためreactの視点から、それは同じコンポーネントです。要素を再作成するには、それらの値の1つを変更する必要があります。

このコードは(NewInputTextが常に新しい機能を参照するため)、それはレンダリングするたびにtypeNewInputTextの要素を変更:

reset = (selected) => { 
     this.setState({ 
     selectedInputName: selected.target[selected.target.selectedIndex].text, 
     selectedInputId: selected.target.value 
     }); 
}; 

makeTextInput =() => { 
    return (
     <TextInput 
      label={this.state.selectedInputName} 
      placeholder={`Please enter ${this.state.selectedInputName} here!`} 
      onBlur={event => this.setState({[this.state.selectedInputId]: event.target.value})} 
      showClear 
     /> 
    ); 
}; 
render() { 
    let NewInputText =() => ''; 
    if (this.state.selectedInputId !== '') { 
     NewInputText =() => this.makeTextInput(); 
    } 
    return (
     <Select 
      label="What would you like to search with?" 
      options={this.props.searchOptions} 
      onChange={selected => this.reset(selected)} 
     /> 
     <div className="search margin_bottom_large"> 
      <NewInputText /> 
    ); 

このコードが毎回TextInputに異なる鍵を割り当てる:

reset = (selected) => { 
     this.setState({ 
     selectedInputName: selected.target[selected.target.selectedIndex].text, 
     selectedInputId: selected.target.value 
     }); 
}; 

makeTextInput =() => { 
    return (
     <TextInput 
      key={Math.random()} 
      label={this.state.selectedInputName} 
      placeholder={`Please enter ${this.state.selectedInputName} here!`} 
      onBlur={event => this.setState({[this.state.selectedInputId]: event.target.value})} 
      showClear 
     /> 
    ); 
}; 
render() { 
    let newInputText = ''; 
    if (this.state.selectedInputId !== '') { 
     newInputText = this.makeTextInput(); 
    } 
    return (
     <Select 
      label="What would you like to search with?" 
      options={this.props.searchOptions} 
      onChange={selected => this.reset(selected)} 
     /> 
     <div className="search margin_bottom_large"> 
      {newInputText} 
    ); 
+0

よろしくお願いします。あなたは私の苦労をすべて終わらせました。詳細な説明をありがとうございます。 – Shrav

0

便利なことができ、あなたのコードの残りの部分を知ってはいけないが、あなたが試すことができます:

makeTextInput =() => (
     <TextInput 
      label={this.state.selectedInputName} 
      placeholder={`Please enter ${this.state.selectedInputName} here!`} 
      onBlur={event => this.setState({[this.state.selectedInputId]: event.target.value})} 
      showClear 
     /> 
    ); 

change = (event) => { 
    this.setState({ 
     selectedInputName: event.target.value 
    }); 
} 

render() { 
     return (
      <Select 
      label="What would you like to search with?" 
      options={this.props.searchOptions} 
      onChange={this.change} 
      /> 
      <div className="search margin_bottom_large"> 
      {this.makeTextInput()} 
     ); 

あなたがする必要がどのようにのみ適切にSETSTATEです。状態を変更するたびに、コンポーネントが再レンダリングされます。つまり、makeTextInputメソッドがトリガーされます。

EDIT:

方法によって、この場合には、renderメソッドでコンポーネントを返すためgetterを使用するのは良いアイデアです:

get textInput() { 
    return (
     <TextInput 
     label={this.state.selectedInputName} 
     placeholder={`Please enter ${this.state.selectedInputName} here!`} 
     onBlur={event => this.setState({[this.state.selectedInputId]: event.target.value})} 
     showClear 
     /> 
    ); 

} 

し、その後でメソッドをレンダリングするだけ{this.textInput}

を使用
+0

上記のコードを更新しました。私はあなたが言ったことをしています。私はラベルを変更することができます。私の問題は、選択されたオプションが変更されても、以前に入力された入力値が常に存在するということでした。私は何とかそれをリセットしようとしています。私は今まで運がなかった。 – Shrav

2

これを行うより良い方法はありますか?

この状況では、controlled componentデザインパターンを使用するのが理想的だと思います。

class SomeInput extends Component { 
    constructor() { 
     super(); 

     this.state = { 
      value: "" //Keep value state here 
     }; 
    } 

    render() { 
     /* Doing something like the following will allow you to clear 
      the input value simply by doing the following.. 

      this.setState({ value: '' }); 
     */ 
     return (
      <Input 
       type="text" 
       onChange={e => this.setState({ value: e.target.value })} // set value state to entered text 
       value={this.state.value} // set value of input to value piece of state 
      /> 
     ); 
    } 
} 

これにより、あなたが何に設定するか、単に以下this.setState({ value: '' })を行うことにより、いつでも、または任意のイベントのためにそれをクリアすることができ、あなたの入力の現在値へのフルアクセスを提供します。

+0

コンストラクタを使用するとレンダリングされません。理由は分かりません。私はここでもフォームを使用していません。制御されたコンポーネントは常にフォームを使用する必要がありますか? – Shrav

+0

これは、コンポーネントの状態でキャプチャされている値を制御し、入力の値を使用して戻ってレンダリングされるメソッドを指示するものではありません。 –

+0

あなたは何が起こっているのかを見ることができるようにコンストラクタでコードを投稿できます –

関連する問題