尽管状态发生变化,但反应 parent 而不是 re-rendering child

react parent not re-rendering child despite state change

我有一个 DatePicker parent 组件,它有一个 child SearchBar 组件。 SearchBar 是一个具有 onChange 的输入,它连接到 DatePicker 的 handleSearchChange。由于 DatePicker 向下传递其 currentDateObj 状态,SearchBar 将使用插入的当前日期进行初始化。但是,SearchBar 的输入应该从用户输入改变,因为它的 onChange 会改变 DatePicker 的状态,DatePicker 应该反过来改变 SearchBar 的输入,但即使使用我的 console.logs 我也没有看到 SearchBar 是 re-rendered 和输入不断将自身重置为初始日期(今天),而不是显示对用户输入的任何更改。

//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>
    );
  }
});

修改后的答案

getIntialState 方法仅在您的组件首次创建时调用一次,因此在后续渲染中不会有用。

您可能希望将格式化逻辑放在其他地方,例如渲染函数或更方便的生命周期方法,例如 componentWillReceiveProps,这就是我的做法。让我知道是否有帮助,祝你好运。


资源


旧答案:

No longer relevant due to Autobind by Default

传递处理程序时,您可能会丢失 this 绑定。试试这个:

<SearchBar currentDateObj={searchDateObj} handleSearchChange={this.handleSearchChange.bind(this)}/>

查看 this blog by Igor Smirnov 中管理绑定的所有酷炫方法。我使用 Babel 来转换我的代码,并使用 stage-0 预设,我可以简单地在我的 class 处理程序方法中使用粗箭头函数,所以我永远不必担心 this.

尝试将关键字 this 绑定到您的 handleSearchChange 函数。

<SearchBar currentDateObj={searchDateObj} handleSearchChange={this.handleSearchChange.bind(this)}/>
<input type="text" onChange={this.props.handleSearchChange.bind(this)} value={this.state.currentDateObj}/>    

如果您收到类似“无法读取 属性 'setState' of null 的错误,将 this 绑定到您的函数应该可以修复该错误。