【发布时间】:2016-07-07 09:36:20
【问题描述】:
我有一个 DatePicker 父组件,它有一个子 SearchBar 组件。 SearchBar 是一个有 onChange 的输入,它连接到 DatePicker 的 handleSearchChange。由于 DatePicker 向下传递其 currentDateObj 状态,SearchBar 将使用插入的当前日期进行初始化。但是,SearchBar 的输入应该从用户输入改变,因为它的 onChange 会改变 DatePicker 的状态,这反过来又会改变 SearchBar 的输入,但即使使用我的 console.logs,我也看不到 SearchBar 被重新渲染并且输入不断重置自己到初始日期(今天),而不是显示对用户输入的任何更改。
//DatePicker
var DatePicker = React.createClass({
getInitialState: function () {
var today = new Date();
return {currentDateObj: today, searchInput: undefined};
},
handleSearchChange: function (e) {
var inputString = e.target.value.toString();
var inputRegex = /^\d{2}[/]\d{2}[/]\d{4}$/;
if (inputRegex.test(inputString)) {
var year = e.target.value[6]+e.target.value[7]+e.target.value[8]+e.target.value[9];
var month = e.target.value[0]+e.target.value[1];
var day = e.target.value[3]+e.target.value[4];
var currentDateObj = new Date(year, month, day);
this.setState({currentDateObj:currentDateObj });
} else {
this.setState({searchInput: inputString});
}
},
render: function () {
var datePickerComponent = this;
var dateNextYearObj = new Date();
var searchDateObj = this.state.searchInput === undefined ? this.state.currentDateObj : this.state.searchInput;
console.log('hit datepick render');
console.log(this.state.searchInput);
dateNextYearObj.setFullYear(this.state.currentDateObj.getFullYear() + 1);
return(
<div>
<SearchBar currentDateObj={searchDateObj} handleSearchChange={this.handleSearchChange}/>
</div>
);
}
});
//搜索栏
var SearchBar = React.createClass({
getInitialState: function () {
console.log('hit searchbar render')
var currentDateObj = this.props.currentDateObj;
if(typeof (currentDateObj.getMonth) === "function"){
var currentDate = currentDateObj.getDate().toString();
if (currentDate.length === 1) {currentDate = "0" + currentDate;}
var currentMonth = currentDateObj.getMonth().toString();
if (currentMonth.length === 1) {currentMonth = "0" + currentMonth;}
var currentYear = currentDateObj.getFullYear().toString();
var formattedCurrentDate = currentMonth + "/" + currentDate + "/" + currentYear;
return {currentDateObj: formattedCurrentDate};
} else {
return {currentDateObj: currentDateObj};
}
},
render: function () {
return (
<div>
<input type="text" onChange={this.props.handleSearchChange} value={this.state.currentDateObj}/>
</div>
);
}
});
【问题讨论】:
标签: reactjs components parent-child render state