javascript - 如何在 React.js 中使用 componentWillUnmount 删除 setInterval
问题描述
当我移动到其他页面时,我有两个在主主页中运行的间隔出现内存泄漏错误,我知道我应该使用 componentWillUnmount 以便间隔停止在其他页面中运行,但我不知道如何实现这一点。有人可以帮忙吗?
componentDidMount() {
this.widthSlider();
this.startAnimate();
const wow = new WOW();
wow.init();
}
startAnimate = () => {
const arr = [
"One",
"Two",
"Three",
"Four",
"Five",
"Six",
"Seven",
"Eight",
"Nine"
];
let counter = 1;
setInterval(() => {
if (counter === 9) {
counter = 0;
this.setState(defaultState());
} else {
const state = this.state;
state[
`animateLeft${arr[counter]}`
] = `animated fadeInLeftBig delay-${arr[counter].toLowerCase()}`;
state[
`animateRight${arr[counter]}`
] = `animated fadeInRightBig delay-${arr[counter].toLowerCase()}`;
this.setState(state);
}
counter++;
}, 7000);
};
widthSlider = () => {
setInterval(() => {
const slide = this.state.width + 100;
this.state.width === 800
? this.setState({
width: 0
})
: this.setState({
width: slide
});
}, 7000);
};
componentWillUnmount(){
//clear Interval here
}
解决方案
基本上,您需要在componentWillUnmount
.
为了使用它,您需要保存您的间隔 ID,它主要是在componentDidMount()
或 中完成constructor()
constructor() {
super();
// references to
this.sliderInterval = null;
this.animateInterval = null;
}
componentDidMount() {
this.widthSlider();
this.startAnimate();
const wow = new WOW();
wow.init();
}
startAnimate = () => {
const arr = [
"One",
"Two",
"Three",
"Four",
"Five",
"Six",
"Seven",
"Eight",
"Nine"
];
let counter = 1;
//save the interval Id
this.animateInterval = setInterval(() => {
if (counter === 9) {
counter = 0;
this.setState(defaultState());
} else {
const state = this.state;
state[
`animateLeft${arr[counter]}`
] = `animated fadeInLeftBig delay-${arr[counter].toLowerCase()}`;
state[
`animateRight${arr[counter]}`
] = `animated fadeInRightBig delay-${arr[counter].toLowerCase()}`;
this.setState(state);
}
counter++;
}, 7000);
};
widthSlider = () => {
//save the interval Id
this.sliderInterval = setInterval(() => {
const slide = this.state.width + 100;
this.state.width === 800
? this.setState({
width: 0
})
: this.setState({
width: slide
});
}, 7000);
};
componentWillUnmount(){
// clearing the intervals
if(this.sliderInterval) clearInterval(this.sliderInterval)
if(this.animateInterval) clearInterval(this.animateInterval)
}
推荐阅读
- python - pandas - 如果前 2 名则为 1
- android-studio - Flutter SDK 在哪里?[Ubuntu]
- angular - 基于多选下拉菜单过滤 Mat-Table
- python - AWS Glue 嵌套 postgres jsonb 列
- postgresql - 在带有 Postgres 的 Elixir 中,如何让数据库返回未使用的枚举值?
- android - 无法从“模型路径”加载模型
- java - 成功建立socket连接后,服务器如何主动向客户端发送字符串消息?
- ios - 如何使用 nativescript 在 ios 设备上进行通知?
- c# - Automapper 从 v8 迁移到 v9 后使用 ProjectTo 时出现“参数类型不匹配”
- eclipse - 在 Windows 资源管理器文件子菜单中添加“使用 Eclipse 打开”