【发布时间】:2020-10-29 13:19:38
【问题描述】:
我正在尝试定期运行计算(每 5 秒)并使用 setInterval 计时器使用计算值更新组件的状态。我所看到的是updateCalculation() 函数确实 每 5 秒被调用一次,但是当使用 Chrome 开发工具监控内存使用情况时,它只会在setInterval 的每次调用中不断增长。内存似乎永远不会被释放。
快照 1:
快照 2:
定期运行计算可能的解决方法是什么? 我对 React 还是很陌生,真的不确定我做错了什么。
class MyComponent extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
calculated: []
};
}
componentDidMount() {
this.calculationUpdater = setInterval(() => this.updateCalculation(), 5000);
}
componentWillUnmount() {
clearInterval(this.calculationUpdater);
}
// Memory leak here
// The function that gets called by setInterval to calculate data and update the state
updateCalculation() {
let data = [];
for (let i = 0; i < 60000; i++) {
data.push({x: i, y: i, z: i});
}
this.setState({
calculated: data
});
}
render() {
return (
<React.Fragment>
<Child calc={this.state.calculated} />
</React.Fragment>
);
}
}
目前我没有对Child 组件做任何特别的事情。这是它的样子:
class Child extends React.PureComponent {
render() {
return (
<div></div>
);
}
}
【问题讨论】:
-
如果你在 React 旁边使用
setInterval,你可能做错了,你肯定做错了。了解 React 如何通过状态管理 DOM 更新(实际上非常简单,React 官方文档也很棒)。 -
@NinoŠkopac 我实际上是基于这里的“时钟”教程:reactjs.org/docs/…
-
孩子发生了什么事?我不认为答案在上面,因为这本身是不可重现的。
-
@PavlosKaralis 我目前没有在子组件中做任何特别的事情。请查看我更新的问题。
标签: javascript reactjs