【发布时间】:2019-10-28 06:15:54
【问题描述】:
每次onClick 执行时,我都会收到有关内存泄漏的警告消息。如何使用 useEffect 钩子从我的功能组件中的 Context.Consumer 取消订阅组件?
我没有找到取消订阅 AppContext 的方法。 AppContext.unsubsribe() 没用。
import React, {useState, useContext} from 'react';
import {withRouter} from 'react-router-dom';
import axios from 'axios';
import {AppContext} from "../context/AppContext";
const LoginPage = (props) => {
const [name, setName] = useContext(AppContext);
const [isLoading, setIsLoading] = useState(false);
const onClick = () => {
setIsLoading(true);
axios.post('/get-name')
.then(resp => {
setName(resp);
setIsLoading(false);
props.history.push('/');
})
.catch(err => console.log(err))
.finally(() => setIsLoading(false));
};
return (
<div>
<button onClick={onClick}></button>
</div>
);
};
export default withRouter(LoginPage);
浏览器控制台中的错误消息:
警告:无法对未安装的对象执行 React 状态更新
零件。这是一个无操作,但它表明您的内存泄漏 应用。要修复,请取消所有订阅和异步任务 在 useEffect 清理函数中。 在 UserPage 中(由 Context.Consumer 创建) 在 Route 中(由 withRouter(UserPage) 创建) 在 withRouter(LoginPage) 中(由 Context.Consumer 创建) 在Route中(由UserRoute创建)
【问题讨论】:
-
问题真的出在 AppContext 上吗?我认为问题在于您在卸载组件后正在执行
setIsLoading。 -
我应该如何对
setIsLoading方法和isLoading属性执行清理?
标签: reactjs react-hooks react-context use-effect