我有一个表单,其中包含年,月,日的选择下拉列表。
glyphicon
我需要从这些值中创建日期并将它们存储在状态的bootstrap
字段中。为此,我创建了另外三个属性<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
函数合并值的函数,如下所示:
this.state = {
name: '',
email: '',
birthday: '',
country: '',
date_day: '',
date_mth: '',
date_year: ''
}
在此函数中,第二个console.log显示最后一次onChange事件设置的日期。最后一个console.log在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: '', ....}
}
的{{1}}我还不明白。任何人都可以向我解释背后的原因和问题的解决方案吗?
==========
根据Asad,birthday
是asynchronous behavior
,设置状态完成后要执行的任何操作都应该作为参数传递给setState函数。我试过了:
setState
这仍然给我相同的输出 - 显示最后一次onChange事件的日期值。我错过了什么?
======
解决方案是不单独传递函数,而是作为函数传递。
setState
答案 0 :(得分:1)
setState
是异步的,因为React经常批量状态更新以提高性能。这意味着您不能依赖setState
之后的语句中的新鲜状态。如果您依赖于更改的顺序,则应该传递回调,如下所示:
mergeDate(type, value)
{
function postUpdate() {
// All of the code from after your if statements
}
if (type === 'year') { this.setState({ date_year: value }, postUpdate) }
if (type === 'month') { this.setState({ date_mth: value }, postUpdate) }
if (type === 'day') { this.setState({ date_day: value }, postUpdate) }
}
一般情况下,您应该只是事先进行所有计算,只需在函数末尾调用setState
一次,并对状态进行所需的所有更改。