在react中使用useEffect时如何停止出现“超出最大更新深度”

问题描述 投票:0回答:1

在渲染聊天消息并滚动到最后一条消息时,我收到有关 next.js 中超出最大更新深度的错误

“错误:超出最大更新深度。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况。React 限制嵌套更新的数量以防止无限循环”

什么可能导致此错误以及如何修复它?

const scrollRef = useRef<ElementRef<'div'>>(null)
const [fakeLoading, setFakeLoading] = useState(messages.length === 0 ? true : false)

useEffect(() => {
    const timeout = setTimeout(() => {
        setFakeLoading(false)
    }, 1000)

    return () => {
        clearTimeout(timeout)
    }
}, [])

useEffect(() => {
    scrollRef?.current?.scrollIntoView({ behavior: 'smooth' })
}, [messages.length])

return (
    <div className="flex-1 overflow-y-auto pr-4">
        <ChatMessage 
            role="system"
            isLoading={fakeLoading}
            content={`Hello, I'm ${companion.name}, ${companion.description}`}
            src={companion.src}
        />
        {messages.map((message, key) => (
            <ChatMessage 
                key={key}
                content={message.content}
                role={message.role}
                src={companion.src}
            />
        ))}
        {isLoading && (
            <ChatMessage
                role="system"
                isLoading
                src={companion.src}
            />
        )}
        <div ref={scrollRef} />
    </div>
)
reactjs react-hooks
1个回答
0
投票

确保仅在消息更改时调用scrollIntoView。

更新第二个

useEffect
Hook,如下:

useEffect(() => {
  if (scrollRef.current) {
    scrollRef.current.scrollIntoView({ behavior: 'smooth' });
  }
}, [messages.length]);
© www.soinside.com 2019 - 2024. All rights reserved.