reactjs - 如何有条件地渲染使用钩子的 React 组件
问题描述
以下(尽管是人为的)组件违反了 react-hooks/rules-of-hooks(通过 eslint)
function Apple(props){
const {seeds} = props;
if(!seeds){
return null;
}
const [bitesTaken, setBitesTaken] = useState(0);
return <div>{bitesTaken}</div>
}
出现以下错误
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render. Did you accidentally call a React Hook after an early return?
我知道钩子需要按相同的顺序调用,但是这种条件渲染(只要在返回之前没有调用任何钩子,并不妨碍钩子按相同的顺序调用。我认为eslint 规则是太严格了,但也许有更好的方法。
有条件地渲染使用钩子的组件的最佳方法是什么?
解决方案
另一种选择是拆分组件。
import React,{useState} from 'react';
const Apple = (props) => {
const {seeds} = props;
return !!seeds && <AppleWithSeeds />;
};
const AppleWithSeeds =(props) => {
const [bitesTaken] = useState(0);
return <div>{bitesTaken}</div>
};
export default Apple;
这种方法的优点是您的组件保持小而合乎逻辑。
在您的情况下,您可能在 useState 初始化程序中有超过 '0' 的内容,您不希望在条件之前的顶部出现不必要的内容。
推荐阅读
- android - recyclerView 为空时显示单独的视图
- azure - 通过 New-AzureADApplicationKeyCredential 添加的证书未出现在 Azure AD 发现端点中
- javascript - 我正在尝试打印窗口,但代码不起作用
- angular - 依赖注入在角度应用程序中不起作用
- php - 更新 MySQL 值未保存 PHP
- html - 正则表达式插入所有数字周围的标签
- docker - 如何在单个 Docker 容器中并行运行多个服务?
- amazon-ec2 - EC2 cloudformation模板使用条件添加ebs卷
- python - 如何在 Visual Studio 2017 的 Python 项目中添加现有包(用于 IntelliSense)
- python-3.x - 未使用 ColumnDataSource(Dataframe).data 更新 slider.value 值