![](/img/trans.png)
[英]React Warning: Can't perform a React state update on an unmounted component. To fix, cancel all subscriptions
[英]React: SetInterval in ComponentDidMount causing error "Warning: Can't perform a React state update on an unmounted component."
我想为我的 React 应用程序中的组件添加打字效果,我正在使用setInterval
来做到这一点。 一切正常,但我收到以下错误:
Warning: Can't perform a React state update on an unmounted component.
This is a no-op, but it indicates a memory leak in your application.
To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method
该函数从componentDidMount()
开始,所以我不明白为什么它说我正在更新一个未安装的组件。 我尝试在componentWillUnmount()
添加clearInterval()
componentWillUnmount()
但错误仍然显示。
代码:
componentDidMount = () => {
this.typeText();
}
componentWillUnmount(){
console.log(this.state.intervalId);
clearInterval(this.state.intervalId);
}
typeText = () => {
const sp = (text,key) => <span key={key} style={{whiteSpace: 'pre-line'}}>{text}</span>;
const results = this.state.screenText;
let start = 0;
let cursor = 0;
const intervalId = setInterval(() => {
if (results.length) results.pop();
const str = this.state.text.slice(start,cursor);
const span = sp(str,cursor);
results.push(span);
this.setState({screenText:results});
start = Math.floor((cursor / 80));
cursor += 1;
if (cursor > this.state.text.length) clearInterval(intervalId);
},5);
this.setState({intervalId: intervalId});
console.log(this.state.intervalId);
}
render() {
return <span id="typing"> {this.state.screenText}</span>
}
我认为您的代码的问题在于您将intervalId
保存在组件的状态中。
您可能知道,当您调用setState
它会导致rerender
。
您可以将您的intervalId
保存在类的属性中。
请考虑您的代码中的这些更改:
class MyClsss extends React.component{ intervalId = ""; ... }
this.intervalId = setInterval(...)
clearInterval(this.intervalId);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.