给出这个最小的例子:
import React, { useState } from 'react';
function Component({ num }) {
const [lorem, setLorem] = useState('lorem');
return (
<div>
{num}: {lorem}
</div>
);
}
function AnotherComponent({ render = Component }) {
const [isOpen, setIsOpen] = useState(false);
return (
<div>
<button type="button" onClick={() => setIsOpen(true)}>
Open
</button>
{isOpen ? render({ num: 123 }) : null}
</div>
);
}
当运行一个点击按钮的单元测试时,我得到错误Rendered more hooks than during the previous render.
。
这个错误是有道理的-在一个渲染中useState('lorem')
不在文档中,然后当按钮被点击时,它就在文档中了。但是,当我使用JSX定义组件时,这个错误不会发生(即{isOpen ? <Component num={123} /> : null}
,但当我尝试使用渲染属性时,它会发生。
有没有一种方法可以像这样使用渲染 prop 模式并避免钩子错误?
1条答案
按热度按时间xqk2d5yq1#
如前所述,您需要使用
render
作为JSX标记,否则render
中的钩子调用不会被视为单独组件的一部分,而是AnotherComponent
的一部分。在React中,未内置的JSX标记必须以大写字母开头,因此您可以将结构化的render
prop别名为Render
,然后将其用作组件: