2016-11-24 21 views
9

Reactフォーム(ES6構文)を実装し、各フィールドのonChangeイベントを状態の更新を担当するコントローラの親コンポーネントに渡す方法を学習しようとしています。これは、標準のhtml要素ではうまく動作しますが、日付フィールドにはあらかじめ缶詰めされたDatepicker(https://www.npmjs.com/package/react-bootstrap-date-picker)を試していますが、同じ方法で親にイベントを簡単に戻すことはできません。これに対処する簡単な方法はありますか?返信子コンポーネントの状態を更新するonChangeイベント

コントローラコンポーネント

class Parent extends React.Component { 
    constructor (props) { 
     super(props); 
     this.state = {job: ''} 
    } 

    setJobState(event) { 
     var field = event.target.name; 
     var value = event.target.value; 
     this.state.job[field] = value; 
     this.setState({job: this.state.job}); 
    } 


    render() { 
     return <Child onChange={this.setJobState.bind(this)} /> 
    } 
} 

子コンポーネント

class Child extends React.Component { 
    constructor (props) { 
     super(props); 

    } 

    render() { 
     <form> 
     <input type="text" name="jobNumber" onChange={this.props.onChange} /> 
     <DatePicker name="dateCmmenced" onChange={this.props.onChange} /> 
     </form> 
    } 
} 
+0

が見えます'onChange'ハンドラを正しく束縛しますが、' DatePicker'の 'onChange'ハンドラは二つのパラメータで呼び出されます:' v alue'と 'formattedValue'(https://github.com/pushtell/react-bootstrap-date-picker#datepicker-を参照してください)。 'Child'コンポーネントでは、引数の違いを扱うことができる2つの' onChange'イベント用に異なるハンドラを設定するだけです。 – forrert

+0

私はそれを試して、私はそれを働かせることができるかどうかを確認します。ありがとう。 –

+0

状態を更新する方法にも注意してください。 'this.state.job [field] = value'はあなたの状態を更新する方法ではありません。 'this.setState'を呼び出すことによって常に状態を変更してください。 – forrert

答えて

11

DatePickerためonChangeハンドラはなく、引数としてvalueformattedValueと、標準的なブラウザchangeイベントで呼び出されていません。私は、それぞれの入力フィールドのイベントを変換し、あなたのChildコンポーネントに異なるonChangeハンドラを登録することをお勧めします:

コントローラコンポーネント

class Parent extends React.Component { 
    constructor (props) { 
     super(props); 
     this.state = {} 
    } 

    onChange(field, value) { 
     // parent class change handler is always called with field name and value 
     this.setState({[field]: value}); 
    } 


    render() { 
     return <Child onChange={this.onChange.bind(this)} /> 
    } 
} 

あなたがいるような子コンポーネント

class Child extends React.Component { 
    constructor (props) { 
     super(props); 
    } 

    onFieldChange(event) { 
     // for a regular input field, read field name and value from the event 
     const fieldName = event.target.name; 
     const fieldValue = event.target.value; 
     this.props.onChange(fieldName, fieldValue); 
    } 

    onDateChange(dateValue) { 
     // for a date field, the value is passed into the change handler 
     this.props.onChange('dateCommenced', dateValue); 
    } 

    render() { 
     return <form> 
      <input type="text" name="jobNumber" onChange={this.onFieldChange.bind(this)} /> 
      <DatePicker onChange={this.onDateChange.bind(this)} /> 
     </form> 
    } 
} 
関連する問題