2017-03-28 9 views
1

私は入力要素をタイプしている間、p要素をリアルタイムで更新しようとしています。次のリアクションコードは完全に機能します。しかし、value属性をinput要素から完全に削除すると、コードはまだ動作します!次のリアクションコードはなぜ機能しますか?

class ControlledInput extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      input: '' 
     }; 
    } 
    handleInput = (event) => { 
     this.setState({ 
      input: event.target.value 
     }); 
    } 
    render() { 
    return (
     <div> 
     <input 
      value={this.state.input} 
      onChange={this.handleInput} /> 
     <p>Input: {this.state.input}</p> 
     </div> 
    ); 
    } 
}; 

は、だから私の質問は以下のとおりです。

  • value={this.state.input}ラインは何をしますか?
  • なぜプログラムはまだその行なしで動作しますか?
+1

このようにしましょう:純粋なHTMLで 'value'属性が何をするのか知っていますか? –

+0

Reactは入力HTML自体をレンダリングし、それらの状態を保持しているので、実際には存在してはいけません。この値は、開始値の一種として使用されます。変更を開始すると、反応は変更を処理し、値を最新の状態に保ちます。このような操作を行う正しい方法は、 'ref'コールバック – Icepickle

答えて

1

value={this.state.input}は、コンポーネントの入力ボックスにフォームの値を割り当てます。 テキストボックス内のテキストを変更して反応しても入力が再描画されないと、イベントハンドラがまだ起動するため、コードは引き続き動作します。入力値の状態は暗黙のうちにDOMの状態ですが、この状態はコンポーネントからのものではありません。

同じ状態を使用する2つの入力があった場合、入力すると2番目の入力は更新されません。これは、value={this.state.input}を省略したため、予想外のものが表示されます。それを両方の入力値に含めると、テキストボックスはお互いに反映されます。上記のコードで

class ControlledInput extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      input: '' 
     }; 
    } 
    handleInput = (event) => { 
     this.setState({ 
      input: event.target.value 
     }); 
    } 
    render() { 
    return (
     <div> 
     <input 
      onChange={this.handleInput} /> 
     <p>Input: {this.state.input}</p> 



     <input 
      onChange={this.handleInput} /> 
     <p>Input: {this.state.input}</p> 
     </div> 
    ); 
} 
}; 

両方が同じ状態を有していなければならない場合、入力者の一つが更新されません:)

+0

で行うでしょう。しかし、誰がそれを2つのテキストボックスにマッピングするのでしょうか?むしろ、状態の変更を処理し、入力要素や基本的なhtml要素にアクセスする正しい方法を見たいのですが、refコールバックを使用して処理してください。 – Icepickle

+0

@Icepickle上記のコードは、例を示すために作成したものです。誰かが複数の場所に出現するようにテキストを入力したいと思っているのは、その可能性が非常に高いと思います。そして、私は、 'refs'を使って生の要素参照を使って状態を設定することは、それを行うための反応の方法ではないと主張します(https://facebook.github.io/react/docs/refs-and-the-dom) .html#dont-overuse-refs)。 –

+0

少なくとも、文字列ではありません:) – Icepickle

0

= {} this.state.inputライン値が何をしますか?

この行はinput変数あなたの状態を使用して、入力からvalue属性を設定し、あなたのケースでは、開始時に''(何も)でそれを初期化します(つまり、これは<input value="" ...>と同等です) あなたを変更した場合あなたは、入力値は、あなたのプログラムの開始時にfooにどのように変化するかを確認する必要があり

this.state = { 
     input: 'foo' 
    }; 

のようなものにthis.state.input

なぜプログラムはまだその行なしで動作しますか?

すでに開始時に空に設定されているため、プログラム内で実際に何も変更されないためです。あなたのonChangeイベントハンドラはまだ起動します。

関連する問題