面试题答案
一键面试在函数组件中使用 useEffect
替代 componentWillUnmount
在函数组件中,useEffect
第二个参数返回的函数会在组件卸载时执行,这个返回的函数就可以用来替代 componentWillUnmount
的功能。
适用场景
- 清理定时器:当组件挂载时设置了定时器,在组件卸载时需要清理定时器,防止内存泄漏。
- 取消网络请求:组件挂载时发起网络请求,若在请求还未完成时组件卸载,需要取消该请求,避免响应回来时组件已不存在导致错误。
代码示例
- 清理定时器示例
import React, { useEffect } from 'react';
const TimerComponent = () => {
useEffect(() => {
const timer = setInterval(() => {
console.log('定时器在运行');
}, 1000);
return () => {
clearInterval(timer);
console.log('定时器已清理');
};
}, []);
return <div>这是一个包含定时器的组件</div>;
};
export default TimerComponent;
- 取消网络请求示例(以
axios
为例)
import React, { useEffect } from 'react';
import axios from 'axios';
const FetchComponent = () => {
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;
axios.get('/api/data', { signal })
.then(response => {
console.log('请求成功', response.data);
})
.catch(error => {
if (error.name === 'AbortError') {
console.log('请求已取消');
} else {
console.log('请求出错', error);
}
});
return () => {
controller.abort();
console.log('请求已取消');
};
}, []);
return <div>这是一个发起网络请求的组件</div>;
};
export default FetchComponent;
在上述代码中,useEffect
返回的函数会在组件卸载时执行,从而实现类似 componentWillUnmount
的清理功能。