我正在使用setInterval方法通过React的setState()增加一个计数器。但是对于每个间隔,应用程序都会更新多次。
import React, { Component } from 'react';
export default class Arrival extends Component {
state = {
count: 0,
limitTo: 6
}
render() {
try {
setInterval(() => {
this.setState({
limitTo: this.state.limitTo + 6
})
console.log(this.state)
}, 5000);
} catch(err) {
console.log(err)
}
return()
}
}
在最初的5秒钟内,状态将更新一次。
在接下来的5秒钟内,状态将更新2次。
在接下来的5秒钟内,状态将更新4次。等等...
我希望状态每5秒更新一次。
答案 0 :(得分:1)
状态更新时,组件也将更新并重新呈现,因此setInterval
不应位于render
方法内。您可以改为:
class Arrival extends Component {
state = {
count: 0,
limitTo: 6
};
interval = 0;
componentDidMount() {
try {
this.interval = setInterval(() => {
this.setState({
limitTo: this.state.limitTo + 6
});
console.log(this.state);
}, 5000);
} catch (err) {
console.log(err);
}
}
componentWillUnmount() {
clearInterval(this.interval);
}
render() {
return <div />;
}
}
注意:@FrankerZ提醒您,您还应该清理卸载组件的时间间隔,否则时钟将继续滴答;)
答案 1 :(得分:1)
setInterval()
在render()
方法中被调用。这意味着:
setInterval()
方法中调用了render()
,因此渲染将启动另一个计时器。 计时器计时:2 。要解决此问题,请按照另一个答案的建议将setInterval
移至componentDidMount()
,以确保计时器仅启动一次,而不是在每个render
上启动。