reactjs - React 函数组件命名问题
问题描述
当我的组件名称为WithErrorHandler 时,我收到以下错误:
不能在回调中调用 React Hook “useState”。React Hooks 必须在 React 函数组件或自定义 React Hook 函数中调用。
但是当我将其更改为withErrorHandler时,它工作正常。(第一个字母小写)
有人可以解释一下我在这里做错了什么吗?
import React, { useState, useEffect } from 'react';
import Modal from '../../components/UI/Modal/Modal';
import WrapperComponent from '../WrapperComponent/WrapperComponent';
const WithErrorHandler = (WrappedComponent, axios) => {
return props => {
const [error, setError] = useState(null);
const reqInterceptor = axios.interceptors.request.use(req => {
setError(null);
return req;
});
const resInterceptor = axios.interceptors.response.use(res => res, error => {
setError(error);
});
useEffect(() => {
return () => {
axios.interceptors.request.eject(reqInterceptor);
axios.interceptors.response.eject(resInterceptor);
};
}, [reqInterceptor, resInterceptor]);
const closeModalHandler = () => setError(null);
return (
<WrapperComponent>
<Modal show={error} hide={closeModalHandler}>
{error ? error.message : null}
</Modal>
<WrappedComponent {...props} />
</WrapperComponent>
)
}
}
export default WithErrorHandler;
解决方案
尽管它仍然是有效的代码,但它看起来像是在触发关于钩子的保护措施。
只需命名它withErrorHandler
,因为它不是组件,它是返回组件的函数,称为高阶组件(HOC)。
您还可以为返回的组件命名。
// Use camelCase for the HOC function.
const withErrorHandler = (WrappedComponent, axios) => {
// Use PascalCase for the name of the component itself (optional but encouraged).
return function WithErrorHandler(props) => {
// This hook is at the right place already!
const [error, setError] = useState(null);
// ...
return /*...*/
}
}
export default withErrorHandler;
推荐阅读
- reactjs - 需要 Babel "7.0.0-0" 但加载了 "6.26.3"
- java - 预期 Mockito 测试异常
- bash - 有没有办法在并行进程的进程终止时刷新标准输出
- javascript - 读取 JavaScript 中的 JSON 值坐标并绘制到谷歌地图
- c# - 测试 Asp.net 核心;Web api 调用数据库中超过 100 万条记录
- ios - 将 UNIX 时间从 json 导入(swift 结构)转换为日期作为字符串并填充表
- html - 有没有办法在输入 3 个字符后触发选择事件?
- javascript - 如何使用 Plupload.js 向服务器发送数据?
- java - 春季启动肥皂客户端问题
- c# - AspNetCore.Identity LockoutOptions.AllowedForNewUsers 属性