使用以下代码时,我收到一条Rendered fewer hooks than expected. This may be caused by an accidental early return statement.
消息:
{headRows
// Filter table columns based on user selected input
.filter(item => displayedColumns.includes(item.id))
.map(row => (
<TableCell
key={row.id}
align={row.numeric ? "right" : "left"}
padding={row.disablePadding ? "none" : "default"}
sortDirection={orderBy === row.id ? order : false}
>
<TableSortLabel
active={orderBy === row.id}
direction={order}
onClick={createSortHandler(row.id)}
>
{useTranslation(row.label)}
</TableSortLabel>
</TableCell>
))}
我的翻译功能如下:
import { useSelector } from "react-redux";
export const useTranslations = () =>
useSelector(state => state.translations.data, []);
如果我向其中传递一个字符串,则转换功能将按预期运行。但是,如果我将{useTranslation(row.label)}
替换为{row.label}
,则不会再收到错误消息。我认为我不会在这里在循环,条件或嵌套函数中调用Hook,否则我错了吗?
答案 0 :(得分:1)
您有一个呈现单元格列表的组件。但是这里由回调呈现的每个单元格都传递给map
。因此,实际上,您在这里既具有循环功能又具有嵌套功能。
我建议您将回调提取到新组件并进行渲染。在这种情况下,每个单元格都是一个新组件,可让您自由使用挂钩。
const MyTableCell = props => {
const {row} = props;
const title = useTranslation(row.label);
return (
<TableCell>
<TableSortLabel>
{title}
</TableSortLabel>
</TableCell>
)
}
// and then
{headRows
// Filter table columns based on user selected input
.filter(item => displayedColumns.includes(item.id))
.map(row => (
<MyTableCell row={row} key={row.id} />
))}
答案 1 :(得分:0)
请勿在循环,条件或嵌套函数中调用Hooks。
-https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level