我有一个function引导React,其中createList函数在任何一个表单输入(workDone或hoursAndMinutes)的每个键输入上都会被调用。我刚接触过reactjs,也许这是正常的行为,但在我看来并非如此,因此我做错了什么。
var SubjectBox = React.createClass({
getInitialState(){
return({
totalHoursAndMinute:0,
subject:'',
workDone:'',
hoursAndMinutes:'',
})
},
dropDownSelected:function(e){
this.setState({subject:e.target.value})
},
handleChangeToWorkDone(){
let s = this.refs.workDone.getValue();
console.log(s);
this.setState({
workDone: s
});
},
validateWorkDone:function(){
let length = this.state.workDone.length;
if (length >= 10) return 'success';
else if (length > 5) return 'warning';
else if (length > 0) return 'error';
},
validateHoursAndMinutes(){
let hm = this.state.hoursAndMinutes.split(':');
if (hm.length === 2){
return 'success';
}else{
return 'error';
}
},
handleChangeToHoursMinute(){
var minutes =0;
let s =this.refs.hoursAndMinutes.getValue();
let hm = s.split(':');
if (hm.length===2){
var h = parseInt(hm[0].trim());
var m = parseInt(hm[1].trim());
if (!m.isNaN){
var minutes = h*60+m;
}
}
this.setState({
hoursAndMinutes: s,
totalMinutes:minutes
});
},
createList: function(){
console.log("create list function.");
var list=[];
for (var i = 0; i < this.props.subjects.length;i++){
list.push(<option key={i} value={this.props.subjects[i].subject}>{this.props.subjects[i].subject}</option>)
}
return list;
},
handleSubmit: function(e){
e.preventDefault();
console.log(this.state.workDone);
console.log(this.state.subject);
},
render(){
return(
<form onSubmit={this.handleSubmit}>
<Input ref="subjectList" type="select" label="Subject" onChange={this.dropDownSelected}>
{this.createList()}
</Input>
<Input ref="workDone"
type="text"
value={this.state.workDone}
placeholder="What did you do?"
label="What did you do" help="Input is 10 or more characters."
bsStyle={this.validateWorkDone()} hasFeedback
groupClassName="group-class" labelClassName="label-class"
onChange={this.handleChangeToWorkDone} />
<Input ref="hoursAndMinutes"
type="text" value={this.state.hoursAndMinutes} placeholder="HH:MM?"
label="How long did you do it?" help="Input in hours:minutes, example 1:5 = an hour and five minutes."
bsStyle={this.validateHoursAndMinutes()} hasFeedback
groupClassName="group-class"
labelClassName="label-class" onChange={this.handleChangeToHoursMinute} />
<Button type="submit" bsStyle="success">Submit</Button>
</form>
)
}
});发布于 2016-03-25 15:36:09
发生这种情况是因为您在handleChangeToWorkDone和handleChangeToWorkDone setState中使用,后者调用re-render
除非条件呈现逻辑在
setState()中实现,否则shouldComponentUpdate()总是会触发重呈现。如果正在使用可变对象,并且不能在shouldComponentUpdate()中实现逻辑,那么只有在新状态与以前的状态不同时才调用setState(),这将避免不必要的重呈现。
发布于 2016-03-25 19:48:34
在React中,HTML/DOM始终只是对React组件状态的表示。
每当出现onChange或onBlur或任何事件时,如果ReactJs组件的状态被更改(使用setState func),则ReactJs组件将被重新呈现(使用setState func)。
只有当React组件的状态发生变化时,您的UI才可以用您输入的值进行更新。因此,这是反应J的预期行为。
https://stackoverflow.com/questions/36222942
复制相似问题