【发布时间】:2021-09-12 01:00:43
【问题描述】:
我正在关注 React.js 教程。
在其中,使用基于类的组件创建了一个网站。但是现在,它正在被转换为功能组件。
这是一个 HOC,最初返回一个基于类的组件,但现在是一个函数式组件。
现在,当我在其中使用 useState 和 useEffect 时,会出现以下错误:
Line 8:36: React Hook "useState" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function
和
Line 29:9: React Hook "useEffect" cannot be called inside a callback. React Hooks must be
called in a React function component or a custom React Hook function
我使用的是 react 版本 17,而讲师使用的是版本 16。
这是基于类且工作时的代码:
import React, {Component} from 'react'
import Modal from "../../components/UI/Modal/Modal";
const WithErrorHandler = (WrappedComponent , axios) =>
{
return class extends Component
{
state = {
error : null
}
componentWillMount()
{
this.resInterceptor = axios.interceptors.response.use(res => res , (error) =>
{
this.setState({error : error});
});
this.reqInterceptor =axios.interceptors.request.use((req) =>
{
this.setState({error : null});
return(req);
} );
}
componentWillUnmount()
{
axios.interceptors.request.eject(this.reqInterceptor);
axios.interceptors.response.eject(this.resInterceptor);
}
errorConfirmedHandler = () =>
{
this.setState({error : null});
}
render()
{
return(
<>
<Modal
show = {this.state.error}
modalClosed = {this.errorConfirmedHandler}>
{this.state.error ? this.state.error.message : null}
</Modal>
<WrappedComponent {...this.props}/>
</>
);
}
}
}
export default WithErrorHandler;
这是转换为功能组件并且不工作时的代码:
import React, {useState , useEffect} from 'react'
import Modal from "../../components/UI/Modal/Modal";
const WithErrorHandler = (WrappedComponent , axios) =>
{
return props => {
const [error , seterror] = useState(null);
const resInterceptor = axios.interceptors.response.use(res => res , (error) =>
{
seterror(error);
});
const reqInterceptor =axios.interceptors.request.use((req) =>
{
seterror(null);
return(req);
} );
useEffect(() =>
{
return () =>
{
axios.interceptors.request.eject(reqInterceptor);
axios.interceptors.response.eject(resInterceptor);
}
} , [reqInterceptor , resInterceptor])
const errorConfirmedHandler = () =>
{
seterror(null);
}
return(
<>
<Modal
show = {error}
modalClosed = {errorConfirmedHandler}>
{error ? error.message : null}
</Modal>
<WrappedComponent {...props}/>
</>
);
}
}
export default WithErrorHandler;
任何帮助或指导将不胜感激,谢谢。
【问题讨论】:
-
能否包含实例化 HOC 的示例代码?
-
这篇 Stackoverflow 帖子可以让您深入了解您的警告:Warning when using react hooks in HoC。附带说明一下,创建 Hook 是为了在一定程度上替代 HOC,因此请考虑将
WithErrorHandler改为自定义钩子的方法
标签: reactjs react-hooks