年、月、日の選択ドロップダウンを持つフォームがあります。ReactJSで日付を作成する年月日を組み合わせる
<select onChange={(event) => this.mergeDate('day', event.target.value)}>
<option value="1">1</option>
...
</select>
<select onChange={(event) => this.mergeDate('month', event.target.value)}>
<option value="1">January</option>
...
</select>
<select onChange={(event) => this.mergeDate('year', event.target.value)}>
<option value="1977">1e977</option>
...
</select>
私は、これらの値のうち、日付を作成し、状態のbirthday
フィールドに保存する必要があります。これを行うために、私はdate_day
,date_mth
およびdate_year
という3つの追加プロパティを作成しました。
this.state = {
name: '',
email: '',
birthday: '',
country: '',
date_day: '',
date_mth: '',
date_year: ''
}
し、Selectドロップダウン変化に、私は次のようにDate()
機能を使用して値をマージ機能作成:この機能で
mergeDate(type, value)
{
if (type === 'year') { this.setState({ date_year: value }) }
if (type === 'month') { this.setState({ date_mth: value }) }
if (type === 'day') { this.setState({ date_day: value }) }
console.log('merging date now '); // --> Works!
let newDate = new Date(this.state.date_year, this.state.date_mth, this.state.date_day);
console.log(newDate); // --> successful, but shows date value of last onChange event
this.setState({ birthday: newDate });
console.log(this.state); // --> {...., birthday: '', ....}
}
は、第二にconsole.logは最後に設定された日付を表示しますonChangeイベント。最後のconsole.logは、空の値をbirthday
に記録します。私はまだ理解していないsetState
のasynchronous behavior
のために問題を推測しています。問題の背後に理由と解決策を教えてください。
==========
UPDATE
アサド、setState
によるにパラメータとして渡されるべきasynchronous
あると状態を設定した後に行われる任意のアクションが完了しましたsetState関数。私は試しました:
postUpdate()
{
let newDate = new Date(this.state.date_year, this.state.date_mth, this.state.date_day);
this.setState({ birthday : newDate });
}
mergeDate(type, value)
{
if (type === 'year') { this.setState({ date_year:value }, this.postUpdate(newDate))}
if (type === 'month') { this.setState({ date_mth: value }, this.postUpdate(newDate))}
if (type === 'day') { this.setState({ date_day: value }, this.postUpdate(newDate))}
}
これは私には同じ出力を与えています - 最後のonChangeイベントの日付値を示しています。私は何が欠けていますか?
========
SOLUTION
溶液は単独ではなく関数としての機能を渡さないことです。
mergeDate(type, value)
{
if (type === 'year') { this.setState({ date_year:value },() => this.postUpdate())}
if (type === 'month') { this.setState({ date_mth: value },() => this.postUpdate())}
if (type === 'day') { this.setState({ date_day: value },() => this.postUpdate())}
}
'setState'は非同期であることを覚えておく必要があります。それの後ろで処理したい場合は、2番目の引数としてコールバックを渡す必要があります。 –
答えてくれてありがとう、Asad。私はどのようなコールバックを送るべきですか? – anonym
あなたの問題は、あなたが実際に関数を渡すのではなく、呼び出すということです。私のコードに書かれているのと同じ方法で、 'this.setState({date_day:value}、postUpdate)'のように渡すだけです。あなたの場合、メソッドとして設定したので、 '、this.postUpdate.bind(this))'が必要ですが、その時点であなたがすでにやっていることはおそらく読みやすくなります。 –