- Objective:
- Breadcrumb:
# 概念阐释
## 语义
在组件渲染后执行一些[[React Hooks Effect]] 副作用任务后,为了避免内存泄露或不必要的操作,有时需要使用清除副作用。
1. **不需要清除的副作用**:
1. 数据获取
2. 手动更改DOM
3. 向API发出请求并更新状态
2. **需要清除的副作用**:
1. 订阅事件
2. 定时器[[React Hooks Effect 依赖项数组]]
3. 事件监听器
## 语法
```jsx
useEffect(()=>{
//这是副作用代码
console.log("Effect has been run");
//这是清除副作用代码
return () => {
document.removeEventListener()
clearTimeout()
clearInterval()
};
},[dependencies]);//依赖项数组
```
- 清除副作用属于副作用函数的一部分,所以包含在`useEffect`的`(()=>{...});`内。
# 实例
## 例1
写一个清除副作用
```jsx
import React, { useState, useEffect } from 'react';
export default function Counter() {
const [clickCount, setClickCount] = useState(0);
// your code here 编写一个名为 increment() 的事件处理程序,该处理程序将负责跟踪用户单击的次数。定义此函数,以便它使用状态 setter 回调函数调用 setClickCount()并将 clickCount 的上一个值加 1。
const increment = () => {
setClickCount(prev=>prev+1)
};
useEffect(()=>{
document.addEventListener('mousedown',increment); //添加一个事件监听副作用
return () => {
document.removeEventListener('mousedown', increment);//清除副作用
};
},[]);//空依赖数组表示这个effect只在组件挂载和卸载时运行
return (
<h1>Document Clicks: {clickCount}</h1>
);
}
```
## 例2
```jsx
import React, { useEffect } from 'react';
function MyComponent() {
useEffect(() => {
// 设置一个定时器
const timer = setTimeout(() => {
console.log('This will run after 1 second!');
}, 1000);
// 返回一个清除函数
return () => {
clearTimeout(timer); // 当组件卸载前,清除定时器
console.log('Cleanup effect executed');
};
}, []); // 空依赖数组表示这个effect只在组件挂载后运行一次
return <div>Hello, world!</div>;
}
export default MyComponent;
```
# 相关内容
#### 空依赖数组
空依赖数组表示这个effect只在组件挂载和卸载时运行,详情参考[[React Hooks Effect 依赖项数组]]
# 参考资料
- [Clean Up Effects - codecademy](https://www.codecademy.com/journeys/full-stack-engineer/paths/fscj-22-front-end-development/tracks/fscj-22-react-part-ii/modules/wdcp-22-function-components-and-hooks-a2dba9bf-fc64-4118-8656-dfdc35f9e5cc/lessons/the-effect-hook/exercises/clean-up-effects)
- [GPT](https://chat.openai.com/share/7a0f1d65-c4c8-41a7-8e80-5317d84ff338)