Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅第一次对组件渲染作出反应_Javascript_Reactjs_React Jsx_Infinite Scroll - Fatal编程技术网

Javascript 仅第一次对组件渲染作出反应

Javascript 仅第一次对组件渲染作出反应,javascript,reactjs,react-jsx,infinite-scroll,Javascript,Reactjs,React Jsx,Infinite Scroll,首先,我必须说,我是一个新的反应,我被困在某个点上,我需要一些帮助。我正在做一个网络项目,基本上是日历应用程序 想法很简单:我们有一个应用程序,可以显示未来一年的日历。它都是单页的,所以我使用了react scroll组件来简化应用程序的使用。 两侧有两个菜单-左侧有一个包含月份(一月、二月……)的菜单,右侧有一个包含天数(1、2……)的菜单。所以,当用户在3月份点击时,页面会滚动到那个月份,同样的情况会持续几天 在“父渲染方法”中,我包含了两个菜单组件,如下所示: 父组件: <Month

首先,我必须说,我是一个新的反应,我被困在某个点上,我需要一些帮助。我正在做一个网络项目,基本上是日历应用程序

想法很简单:我们有一个应用程序,可以显示未来一年的日历。它都是单页的,所以我使用了react scroll组件来简化应用程序的使用。 两侧有两个菜单-左侧有一个包含月份(一月、二月……)的菜单,右侧有一个包含天数(1、2……)的菜单。所以,当用户在3月份点击时,页面会滚动到那个月份,同样的情况会持续几天

在“父渲染方法”中,我包含了两个菜单组件,如下所示:

父组件:

<MonthsMenu monthsArray={ this.state.monthsArray } onMonthActive={ this.onMonthActive.bind(this) } />

<DaysMenu month={ this.state.month } />
这是左菜单(MonthsMenu组件)渲染:

问题

按月份滚动就像它应该的那样工作。问题是按天滚动只在显示的第一个月有效。如果我将console.log放在parent
onMonthActive
函数中,我可以看到,它只在我第一个月做出反应时被调用,而在进一步滚动时不再被调用。由于我在onMonthActive中使用的
setState
会导致组件重新加载并创建新的DaysMenu,这难道不应该起作用吗

很抱歉发了这么长的帖子,我希望有人知道解决办法

编辑


我没有看到
组件将在
DayMenu
组件上接收道具,这意味着如果父组件更改发送到
DayMenu
的道具,它将不会重新渲染。也就是说,你改变了月份,日子就不会更新了。尝试实现该方法,因为它将在
nextrops
中执行,您可以选择更新本地道具或状态:@lux谢谢您的回答。我已经在DayMenu组件中实现了componentWillReceiveProps,但此方法也只被调用一次。
componentWillReceiveProps
每次父组件尝试将一组新的道具传递给DOM中的组件时都会被调用。继续并创建一个MCVE(),这样我们就可以调试了。@lux我已经从上述问题的所有3个文件中添加了代码。你可以在末尾找到链接。我还能做些什么来让它更简单吗?
onMonthActive(to) {

    var currentDate = moment(moment(to, "MMMM YYYY").unix());
    var currentDate2 = moment.unix(currentDate);

    var daysInCurrentMonth = currentDate2.daysInMonth();

    this.setState({
      month: currentDate2,
      daysInMonth: daysInCurrentMonth
    });
  }
render() {

    const sideMenu = this.props.monthsArray.map((month, i) => {
      var monthString = month.format("MMMM YYYY");
      var monthStringArray = monthString.split(' ');

      var currentMonth = month;

      return (
        <li key={ monthString } >
          <Scroll.Link
            activeClass="active"
            to={ monthString }
            offset={-50}
            spy={true}
            smooth={true}
            duration={500}
            onSetActive={this.props.onMonthActive}>
              { monthStringArray[0].substring(0, 3) }
          </Scroll.Link>
        </li>
      );
    });

    return (
      <div className="months">
        <ul>
          { sideMenu }
        </ul>
      </div>
    );
  }
    render() {

    var currentMonth = moment(this.props.month);
    var daysInMonth = currentMonth.daysInMonth();

    var days = [];
    for (var i = 1; i <= daysInMonth; i++) {
      days.push(i);
    }

    const sideMenu = days.map((day, i) => {

      var anchor = this.props.month.format("MMMM YYYY") + ' ' + day;

      return (
        <li key={ anchor } id={ anchor + ' ' + i}>
          <Scroll.Link
            activeClass="active"
            to={anchor}
            offset={-60}
            spy={true}
            smooth={true}
            duration={500}
            onSetActive={this.dayActive}>
              { day }
          </Scroll.Link>
        </li>
      );
    });

    return (
      <div className="days">
        <ul>
          { sideMenu }
        </ul>
      </div>
    );
  }