【发布时间】:2021-11-30 22:51:56
【问题描述】:
我目前有一个下拉列表select 在“应用”之后过滤一些图表。它工作正常。(见下面的截图)。
The problem is that when another timespan gets selected, React does a re-render to all charts before I click 'Apply' button.
我想通过实现shouldComponentUpdate 来避免这种不必要的重新渲染,但我不知道怎么做。
低于我尝试但它不起作用(仍然是重新渲染):
shouldComponentUpdate(nextState) {
if (this.state.timespanState !== nextState.timespanState) {
return true;
}
return false;
}
但它总是返回true,因为nextState.timespanState 是undefined。为什么?
下拉选择
<Select value={this.state.timespanState} onChange={this.handleTimeSpanChange}>
handleTimeSpanChange = (event) => {
this.setState({ timespanState: event.target.value });
};
constructor(props) {
super(props);
this.state = { timespanState: 'Today'};
this.handleTimeSpanChange = this.handleTimeSpanChange.bind(this);
}
【问题讨论】:
-
want to avoid this unnecessary re-render为什么要这样做?您是否看到性能问题?你看到逻辑错误了吗? -
@Adam 因为这是不必要的重新渲染,我希望在单击“应用”按钮后更新图表
-
从用户体验的角度来看,如果应用按钮所做的只是重新渲染图表,您可能应该去掉应用按钮,因为您让用户无缘无故地再次点击。其次,而不是
shouldComponentUpdate,这是一个错误陷阱,您应该只传递“应用”值。这可以通过添加第二个状态字段appliedTimeSpan并在用户单击应用按钮并将appliedTimeSpan传递给图表组件时更新它来完成。 使用shouldComponentUpdate控制渲染是不好的做法(从我的角度来看),因为错误的可能性很高。 -
@Adam 我也意识到 shouldComponentUpdate 在我的情况下不是一个好的解决方案。因为一方面我不想重新渲染图表,另一方面我想在时间跨度下拉列表更改时重新渲染它。因此,很难控制
-
你能发布更多的组件代码吗,听起来
appliedTimeSpan的第二个状态字段肯定会解决你的问题。
标签: javascript reactjs state rerender