【发布时间】:2020-07-15 13:52:51
【问题描述】:
我想通过滚动来改变样式。
此代码无法正常工作 . 当我上下滚动太多次太快时,浏览器就会死机、崩溃。
我想我用错了useEffect()。我该如何解决这个问题。
const ArticleItem = ({title, content, active, chapter, program, id, scrollPos}) => {
const ref = useRef(null);
const client = useApolloClient();
useEffect(() => {
if(ref.current.offsetTop <= (scrollPos + 200)) {
client.writeData({data: {
curChapter: chapter.num,
curArticle: id,
curProgram: program.name
}});
}
});
if(active === false)
return ( // Inactive Article
<div className='section-item' ref={ref}>
<h2>{title.toUpperCase()}</h2>
<ReactMarkdown source={content} />
<br />
</div>
)
return ( // Active Article
<div className='section-item active' ref={ref}>
<h2>{title.toUpperCase()}</h2>
<ReactMarkdown source={content} />
<br />
</div>
)
}
结果,我遇到了这个警告。
警告:已超出最大更新深度。当组件在 useEffect 中调用 setState 时,可能会发生这种情况,但 useEffect 要么没有依赖数组,要么每次渲染时其中一个依赖项都发生了变化。
我认为这是问题的原因?!
【问题讨论】:
-
您还需要包含
useEffect的依赖数组。这样它就无限运行了。可能您想在其中包含scrollPos。 -
@norbitrial 是正确的,请执行:
useEffect(() => {}, [dependency]现在该函数仅在依赖值更改时才会运行。您可能还想谴责,这意味着只有在一定时间内没有改变时才更新 -
@Elias 认为你的意思是“去抖动”
-
哦,是的......对不起
标签: javascript reactjs graphql react-hooks