使用React,我有以下功能组件,其中我使用了useEffect()
:
import React, { useEffect } from 'react';
import { connect } from 'react-redux';
const MessagingComponent = React.memo(({ loadMessages, messages, ...props }) => {
useEffect(() => {
loadMessages();
});
return <div {...props}>These are the messages</div>;
});
const mapDispatchToProps = dispatch => ({
loadMessages: () => dispatch({ type: 'LOAD_MESSAGES' })
});
const mapStateToProps = state => {
return {
messages: state.chatt.messages.chatMessages
};
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(MessagingComponent);
正如您所看到的,我有一个效果回调函数,在我的 MessagingComponent
中的 useEffect()
回调中调用了 loadMessages()
函数:
useEffect(() => {
loadMessages();
});
调用loadMessages()
会加载消息,导致组件重新渲染。这种行为是预期的,但问题在于重新渲染会导致useEffect()
钩子再次触发,从而再次调用loadMessage()
。这反过来会从后端加载消息并导致组件再次渲染,循环重复。如何避免这种情况?我是否应该在
useEffect()
钩子中简单地放置一个if条件,并检查消息属性?
React Hook useEffect 缺少依赖项:loadMessages,请在依赖项数组中包含它们,或者删除依赖项数组 react-hooks/exhaustive-deps
。 - talhatahiruseEffect(() => { loadMessages(); }, [loadMessages]);
。当您提供一组依赖项时,只有在其中一个依赖项更改时,才会运行您的效果。因此,如果您的loadMessage
函数不会更改,那么您的效果也不会再次运行。 - alextouzelloadMessages
函数的引用不改变,它将不会导致无限循环。默认情况下,mapDispatchToProps 只会在组件实例创建时调用一次,因此在这种情况下,函数引用应该保持不变,即使它在其依赖项中有loadMessages
,useEffect 钩子也只会运行一次。 - alextouzel