首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么ReactClass中的function函数在表单输入更改事件上被反复调用

为什么ReactClass中的function函数在表单输入更改事件上被反复调用
EN

Stack Overflow用户
提问于 2016-03-25 15:33:23
回答 2查看 190关注 0票数 3

我有一个function引导React,其中createList函数在任何一个表单输入(workDone或hoursAndMinutes)的每个键输入上都会被调用。我刚接触过reactjs,也许这是正常的行为,但在我看来并非如此,因此我做错了什么。

代码语言:javascript
运行
复制
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>

    )
  }
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-25 15:36:09

发生这种情况是因为您在handleChangeToWorkDonehandleChangeToWorkDone setState中使用,后者调用re-render

除非条件呈现逻辑在setState()中实现,否则shouldComponentUpdate()总是会触发重呈现。如果正在使用可变对象,并且不能在shouldComponentUpdate()中实现逻辑,那么只有在新状态与以前的状态不同时才调用setState(),这将避免不必要的重呈现。

票数 3
EN

Stack Overflow用户

发布于 2016-03-25 19:48:34

在React中,HTML/DOM始终只是对React组件状态的表示。

每当出现onChange或onBlur或任何事件时,如果ReactJs组件的状态被更改(使用setState func),则ReactJs组件将被重新呈现(使用setState func)。

只有当React组件的状态发生变化时,您的UI才可以用您输入的值进行更新。因此,这是反应J的预期行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36222942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档