reactjs - UseEffect 清理功能不会删除我的间隔
问题描述
我有App
和Test
组件。
应用程序
import "./App.css";
import { React, useState, useEffect} from 'react';
import Test from './Test';
function App() {
const [load, setLoad] = useState(true);
useEffect(() => {
console.log('useEffect called');
})
return (
<div>
{load ? <Test></Test> : null}
<button onClick={() => setLoad(!load)}>Toggle</button>
</div>
);
}
export default App;
测试
import React from 'react'
class Test extends React.Component {
counter = 0;
interval;
componentDidMount() {
console.log('componentDidMount')
this.interval = setInterval(() => {
console.log(this.counter++);
},1000)
}
componentWillUnmount() {
clearInterval(this.interval);
}
render() {
return (
<div>
<h1>test</h1>
</div>
)
}
}
export default Test
当测试组件被破坏时,我想清理间隔
如果我使用类组件
import React from 'react'
class Test extends React.Component {
counter = 0;
interval;
componentDidMount() {
console.log('componentDidMount')
this.interval = setInterval(() => {
console.log(this.counter++);
},1000)
}
componentWillUnmount() {
clearInterval(this.interval);
}
render() {
return (
<div>
<h1>test</h1>
</div>
)
}
}
export default Test
例如,当我单击 Toggle 组件时,这将起作用,间隔被清除。
但是如果我使用功能组件
import React, { useEffect } from 'react'
function Test() {
let counter = 0;
useEffect(() => {
let interval = setInterval(() => {
counter++;
console.log(counter);
return () => {
console.log('interval', interval)
clearInterval(interval);
}
},1000)
})
return (
<div>
<h1>Test</h1>
</div>
)
}
export default Test
然后它不起作用。当测试组件被破坏时,我仍然在控制台中打印间隔
我怎样才能在这里清理?
解决方案
您需要在区间下方添加回报。所有 useEffects 清理都是这样发生的:
useEffect((){
//do stuff
return ()=> //clean stuff
}, [])
另外,不要忘记 useEffect 末尾的依赖数组。
推荐阅读
- automated-tests - testcafe 中 --disable-page-reloads 标志的进展或方向是什么?
- sublimetext - ESLint 找不到插件“eslint-plugin-react”
- python-3.x - 如何使用 ezdxf 将序号添加到图层名称
- javascript - 使用nodejs将文件上传到s3
- spring-boot - 带有 Vault 的 Spring Cloud Config Server - Vault 覆盖本机配置文件中的任何值
- python - 将数据框的行保存到单独的 txt 文件中
- java - 无法理解如何在下面的课程中完成自动接线
- python - 如何解析两个粘在一起的元素?
- jasper-reports - 基于另一个字段的字段求和
- java - 将 Apache HttpClient 响应拦截器与请求匹配