是否可以通过 useEffect 挂钩中的清除功能从 setCounter 取消订阅?
is it possible to cancel the subscription from a setCounter with a cleanup function in useEffect hook?
我使用 setTimeout 制作了简单的动画,但我在控制台中收到红色警告:
1 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 a useEffect cleanup function. in Home (created by Context.Consumer)
useEffect(() => {
counter > 0 && setTimeout(() => setCounter(counter - 1), 1000);
if (counter <= 16 && counter > 8) {
setFlexStyle({
width: "100%",
float: "left",
marginright: "-100%",
position: "relative",
display: "list-item",
});
setClassStyle("flex-active-slide");
setFlexStyle2({
width: "100%",
float: "left",
marginright: "-100%",
position: "relative",
display: "none",
});
setClassStyle2("");
} else if (counter <= 8 && counter > 0) {
setFlexStyle({
width: "100%",
float: "left",
marginright: "-100%",
position: "relative",
display: "none",
});
setClassStyle("");
setFlexStyle2({
width: "100%",
float: "left",
marginright: "-100%",
position: "relative",
display: "list-item",
});
setClassStyle2("flex-active-slide");
} else {
setCounter(16);
}
}, [counter]);
useEffect(() => {
const timer = counter > 0 ? setTimeout(() => setCounter(counter - 1), 1000) : null
return () => clearTimeout(timer)
}, [counter] )
试试这个
我使用 setTimeout 制作了简单的动画,但我在控制台中收到红色警告:
1 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 a useEffect cleanup function. in Home (created by Context.Consumer)
useEffect(() => {
counter > 0 && setTimeout(() => setCounter(counter - 1), 1000);
if (counter <= 16 && counter > 8) {
setFlexStyle({
width: "100%",
float: "left",
marginright: "-100%",
position: "relative",
display: "list-item",
});
setClassStyle("flex-active-slide");
setFlexStyle2({
width: "100%",
float: "left",
marginright: "-100%",
position: "relative",
display: "none",
});
setClassStyle2("");
} else if (counter <= 8 && counter > 0) {
setFlexStyle({
width: "100%",
float: "left",
marginright: "-100%",
position: "relative",
display: "none",
});
setClassStyle("");
setFlexStyle2({
width: "100%",
float: "left",
marginright: "-100%",
position: "relative",
display: "list-item",
});
setClassStyle2("flex-active-slide");
} else {
setCounter(16);
}
}, [counter]);
useEffect(() => {
const timer = counter > 0 ? setTimeout(() => setCounter(counter - 1), 1000) : null
return () => clearTimeout(timer)
}, [counter] )
试试这个