2016-12-08 5 views
1

Reactを使用して簡単な連絡フォームを作成しようとしています。最終的に状態から収集されたデータをデータベースに送信しますが、今は正しい値をコンソールログに記録しようとしています。フォーム提出から2つの入力フィールドの状態を更新する

メールフィールドは名前フィールドよりも優先され、コンソールログの両方の状態では名前が表示され、メールは未定義です。ここに私のevent.target.emailへの参照がイベント要素上に存在しないコンポーネント

import React, { Component, PropTypes } from 'react'; 
import ContactData from '../data/ContactData.js'; 


class FormContact extends Component { 
    constructor(props) { 
     super(props) 
     this.state = { 
      name: '', 
      email: '', 
      textArea: '' 
     } 
    } 

    handleChange(event) { 
     event.preventDefault(); 
     this.setState({ 
      name: event.target.value, 
      email: event.target.email 
     }) 
    } 

    handleSubmit(event) { 
     event.preventDefault(); 
     console.log(this.state.name + ' ' + this.state.email); 
    } 

    render() { 
     return (
      <form onSubmit={this.handleSubmit.bind(this)}> 
       <label> Name: 
        <input type="text" placeholder="Name" value={this.state.name} onChange={this.handleChange.bind(this)} /> 
       </label><br /> 
       <label> Email: 
        <input type="text" placeholder="Email" value={this.state.email} onChange={this.handleChange.bind(this)}/> 
       </label><br /> 
        <input className="btn btn-primary" type="submit" value="Submit" /> 
      </form> 
     ) 
    } 
} 

FormContact.PropTypes = { 
    subName: PropTypes.string, 
    subEmail: PropTypes.string 
} 

FormContact.defaultProps = { 
    subName: 'Sam', 
    subEmail: '' 
} 

class Contact extends Component { 
    render() { 
     return (
      <div> 
       <h1>CONTACT PAGE</h1> 
       <FormContact /> 
      </div> 
     ) 
    } 
} 


export default Contact; 

答えて

8

私はあなたが望むものを理解していれば、以下のように、あなたがそれを行うことができます:

  • はのためのあなたの状態で空のオブジェクトを追加します。フォームの値

    formValues: {}

  • は、あなたのフィールド

    にname属性を追加します。 10

    <input name="name" .... /> <input name="email" .... />

  • その名前に依存

    let formValues = this.state.formValues; 
    let name = event.target.name; // Field name 
    let value = event.target.value; // Field value 
    
    formValues[name] = value; 
    
    this.setState({formValues}) 
    
  • handleChange機能で自分の状態を更新し、値が1つのレベル深く行けば、あなたは value={this.state.formValues["name"]}の代わりvalue={this.state.name}使用することができます - nameは入力フィールドのname属性の値です。

次のようにこのように、すべてが一緒にする必要があります:

class Test extends React.Component { 
    constructor(props) { 
     super(props) 
     this.state = { 
      formValues: {} 
     } 
    } 

    handleChange(event) { 
     event.preventDefault(); 
     let formValues = this.state.formValues; 
     let name = event.target.name; 
     let value = event.target.value; 

     formValues[name] = value; 

     this.setState({formValues}) 
    } 

    handleSubmit(event) { 
     event.preventDefault(); 
     console.log(this.state.formValues); 
    } 

     render(){ 
     return (
     <form onSubmit={this.handleSubmit.bind(this)}> 
       <label> Name: 
        <input type="text" name="name" placeholder="Name" value={this.state.formValues["name"]} onChange={this.handleChange.bind(this)} /> 
       </label><br /> 
       <label> Email: 
        <input type="text" name="email" placeholder="Email" value={this.state.formValues["email"]} onChange={this.handleChange.bind(this)}/> 
       </label><br /> 
        <input className="btn btn-primary" type="submit" value="Submit" /> 
      </form> 
    ) 
    } 
} 

React.render(<Test />, document.getElementById('container')); 

Here is fiddle.

は、この情報がお役に立てば幸いです。

+0

私は仕事の後でこれを設定します - 私が探していたもののように見える、ありがとう! – user3622460

+1

FormContactは、制御されるタイプのテキストの制御されない入力を変更しています。入力要素は、制御されていない状態から制御された状態に切り替わるべきではありません(またはその逆)。コンポーネントの寿命の間、制御された入力要素または制御されていない入力要素を使用するかどうかを決めます。 - - このエラーを生成します – user3622460

+0

制御されない入力の問題を修正するには、名前と電子メールの空の文字列でformValuesオブジェクトを初期化する必要があります。 –

1

を反応させるのです。インラインイベントハンドラからのテキスト入力の値は、電子メールと名前の両方に対してevent.target.valueとなります。迅速な解決策は、入力ごとに個別のハンドラを作成することです:

handleChangeName(event) { 
    event.preventDefault(); 
    this.setState({ name: event.target.value }); //<-- both use the same reference 
}            // to get the contextual value 
handleChangeEmail(event) {      // from the inputs v 
    event.preventDefault();      //     | 
    this.setState({ email: event.target.value }); //<-------------------- 
}
+0

ええ私は2つの異なるハンドラが動作することを知っていますが、それを一度に処理する方法がなければならないような気がします。そうでなければ大きなフォームのハンドオーバにはTONのハンドラ機能があります。より良い方法が必要です(私はそれらが悪いと聞いたので、refsを使用していません) – user3622460

+0

私は参照してください。その場合、バインドする追加パラメータを渡そうとしましたか?変更したい値の文字列名ですか?次に、 'handleChange'メソッドは、その値をsetStateで動的に使用できます。別のオプションは、入力をラップし、効果的に制御された入力にする高次コンポーネントを作成することです。 – Pineda

関連する問題