Javascript 仅第一次对组件渲染作出反应
首先,我必须说,我是一个新的反应,我被困在某个点上,我需要一些帮助。我正在做一个网络项目,基本上是日历应用程序 想法很简单:我们有一个应用程序,可以显示未来一年的日历。它都是单页的,所以我使用了react scroll组件来简化应用程序的使用。 两侧有两个菜单-左侧有一个包含月份(一月、二月……)的菜单,右侧有一个包含天数(1、2……)的菜单。所以,当用户在3月份点击时,页面会滚动到那个月份,同样的情况会持续几天 在“父渲染方法”中,我包含了两个菜单组件,如下所示: 父组件:Javascript 仅第一次对组件渲染作出反应,javascript,reactjs,react-jsx,infinite-scroll,Javascript,Reactjs,React Jsx,Infinite Scroll,首先,我必须说,我是一个新的反应,我被困在某个点上,我需要一些帮助。我正在做一个网络项目,基本上是日历应用程序 想法很简单:我们有一个应用程序,可以显示未来一年的日历。它都是单页的,所以我使用了react scroll组件来简化应用程序的使用。 两侧有两个菜单-左侧有一个包含月份(一月、二月……)的菜单,右侧有一个包含天数(1、2……)的菜单。所以,当用户在3月份点击时,页面会滚动到那个月份,同样的情况会持续几天 在“父渲染方法”中,我包含了两个菜单组件,如下所示: 父组件: <Month
<MonthsMenu monthsArray={ this.state.monthsArray } onMonthActive={ this.onMonthActive.bind(this) } />
<DaysMenu month={ this.state.month } />
这是左菜单(MonthsMenu组件)渲染:
问题
按月份滚动就像它应该的那样工作。问题是按天滚动只在显示的第一个月有效。如果我将console.log放在parentonMonthActive
函数中,我可以看到,它只在我第一个月做出反应时被调用,而在进一步滚动时不再被调用。由于我在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>
);
}