我正在使用自己的MERN应用,当我在NewsPage组件中记录smth时,它会无限记录。
NewsPage组件:
const NewsPage = ({news, fetchNews}) => {
const postNews = (title, body) => {
axios.post("http://localhost:9000/news", { title, body });
}
useEffect(() => {
fetchNews();
}, [fetchNews, postNews])
return (
<>
<AddNewsForm postNews={postNews}/>
<h1>News:</h1>
<NewsItemPage news={news} />
</>
);
};
const mapStateToProps = state => ({
news: state.news
})
export default connect(mapStateToProps, {fetchNews})(NewsPage);
获取新闻操作:
export const fetchNews = () => dispatch => {
fetchRequest();
try {
const fetch = async () => {
const res = await axios.get("http://localhost:9000/news");
dispatch({
type: a.FETCH_NEWS_SUCCESS,
payload: res.data
});
}
fetch()
} catch (e) {
dispatch({
type: a.FETCH_NEWS_FAILURE,
error: e
});
}
}
它可以正常工作,我可以从中获取新闻并将新闻发布到后端,但是如果我在控制台中记录任何内容,它将无限记录,并且我不会收到任何错误。
有没有办法解决这个问题,这是一个真正的问题吗?
答案 0 :(得分:0)
可能是因为render
中使用了控制台日志所位于的任何功能,而该功能本身就是一个循环。否则,我没有其他办法可以知道为什么会重复。除非您正在执行的代码变慢,否则可能最终不会成为问题,这将来可能会导致性能问题。
答案 1 :(得分:0)
您正在跟踪fetchNews
数组中的postNews
和useEffect
,这将在每个渲染器上重新运行fetchNews();
。
除非第二个参数useEffect
中的值是基元,否则您需要使用一些深层比较方法:https://stackoverflow.com/a/54096391/4468021
答案 2 :(得分:0)
实际上,您使用了错误的useEffect
。
每次组件收到新道具时都会调用效果,因此,它看起来像这样:
1)组件安装,从useEffect
调用函数
2)进行API调用,更新存储中的数据
3)数据传递到容器,更新“哑巴”组件
4)Dumb组件进行重新渲染,并从useEffect
调用func,这就是无限循环。
实际上,您没有内存泄漏是很奇怪的。
您可以做的是:
1)添加一些条件渲染。我很确定,您只需要在初始加载时调用它即可。
2)添加类似ImmutableJS
的东西,它不会重新渲染组件,并且如果没有任何变化也不会改变存储空间