未捕获错误:呈现的钩子比预期的要少.这可能是由意外的早期返回语句引起的



我把这个函数组件作为我项目的一部分。我还没有像react文档中所说的那样在循环、条件或嵌套函数中调用任何钩子。我还将钩子放在任何return语句之前,以便react可以到达它们中的每一个。然而,我得到了这个错误,它说未捕获错误:呈现的钩子比预期的要少。这可能是由意外的早期返回语句引起的。

知道问题出在哪里吗?

function ScrollRenderingCom(props) {
const { children, aproximateHeight = 200} = props;
const [isIntersecting, setIsIntersecting] = useState(false);
const fakeComponent = useRef(null);

const callback = useCallback((entries) => {
const [entry] = entries;
if (entry.isIntersecting) {
setIsIntersecting(true)
}
}, []);
useEffect(() => {
const options = {
root: null,
rootMargin: '0px',
threshold: 0,
}
const observer = new IntersectionObserver(callback, options);
observer.observe(fakeComponent.current);
return () => {
observer.disconnect();
}
}, [callback]);
return (
isIntersecting ? children 
: 
<div 
ref={fakeComponent}
className={children.type().props.className}
style={{ visibility: 'hidden',
minHeight: aproximateHeight + 'px' }}
>
</div>
)
}

这是对控制台进行反应打印的组件堆栈跟踪,该控制台指定了该组件中发生的错误

上述错误发生在ScrollRenderingCom组件中:

at ScrollRenderingCom (http://localhost:3000/static/js/bundle.js:3468:5)
at div
at PostSection1
at Home
at Routes (http://localhost:3000/static/js/bundle.js:229775:5)
at div
at Router (http://localhost:3000/static/js/bundle.js:229708:15)
at BrowserRouter (http://localhost:3000/static/js/bundle.js:228517:5)
at App

更新:

从负反射中,我注意到我的示例代码不足以重现这个问题。因此,我为上面的组件提供了一个Child组件,这样它就可以单独运行和检查。这是子组件

function Child() {
const [successMessage, setSuccessMessage] = useState(false);
useEffect(() => {
if (successMessage) {
alert('this app works correctly')
}
return () => {setSuccessMessage(false)}
})
const handleOnClick = () => {
setSuccessMessage(true);
}
return(
<div className="child"
style={{width: '500px', 
height: '200px',
backgroundColor: 'green',
color: 'white'
}} 
>
<h1>this component should be rendered when
the empty blue div element completely 
enters the viewport
</h1>
<h3>if you see the above message click Yes</h3>
<button onClick={handleOnClick} >Yes</button>
</div>
)
}

这是您可以检查问题的最后一个现场演示

请让我知道我的问题中有任何进一步的缺陷,并在击落之前给我一个修复它们的机会

通过调用children.type,您创建了该组件,这将导致挂钩有条件地运行。

尝试更改:

children.type().props.className

children.props.className

无需在此处创建组件

https://codesandbox.io/s/demo-forked-egofes?file=/src/ScrollRenderingCom.js:816-825

最新更新