【发布时间】:2019-12-14 00:58:59
【问题描述】:
我需要帮助来停止在路由更改时再次进行相同的 API 调用。我试图在网络和 stackoverflow 上找到可用的解决方案,但我无法弄清楚修复此问题需要进行哪些更改。
我还尝试使用 sessionStorage 来存储一个标志,如果 API 调用被触发,那么标志设置为 true,并且在路由器更改时,我检查标志是否为 true,然后不要进行任何 API 调用。但随后它会清空文章列表。
我有一个带有路由的主要 App 组件,其中包含两个组件:(请参见下面给出的代码)
- 文章首页
- 书签首页
我面临的问题是,当我第一次点击http://localhost:3001 时,它会重定向到http://localhost:3001/articles 页面并正确呈现ArticleHome 组件并获取文章列表。然后我单击书签链接,它会呈现http://localhost:3001/bookmarks 路由和相关组件,并进行 API 调用以呈现书签列表。
但是当我使用路由器 http://localhost:3001/articles 返回文章页面时,由于每次路由更改时组件重新呈现,它再次触发 API 调用以获取文章。
谁能指导我如何在路由器更改和组件重新渲染时停止再次执行 API 调用?
如果数据已经加载,是否有更好的方法来处理同一组件的路由器更改时的 API 调用?
class App extends React.Component<any, any> {
constructor(props: any) {
super(props);
}
render() {
return (
<Router>
<React.Fragment>
<Switch>
<Route exact path="/" render={() => <Redirect to="/articles" />} />
<Route path="/articles" render={() => <ArticleHome type="articles" />} />
<Route path="/bookmarks" render={() => <BookmarkHome type="bookmarks" />} />
<Route path="*" component={NoMatch} />
</Switch>
</React.Fragment>
</Router>
);
}
}
export default App;
在 ArticleHome 组件中,我有一个 API 调用,用于获取文章列表并在 BookmarkHome 组件我有另一个 API 调用来获取书签列表。
ArticleHome 组件:(BookmarkHome 组件的功能相同)
import React, { useReducer, useEffect, useState } from "react";
const ArticleHome = (props: any) => {
const [state, setState] = useState({
articles: [],
reRender: true
});
const [newState, dispatch] = useReducer(articleReducer, state);
useEffect(() => {
// componentWillUnmount
return () => {
console.log('unmounting 1...');
setState({
...state,
reRender: false
});
}
},[state.reRender]); // componentDidUpdate
const fetchAllrecords = () => {
fetch(url)
.then((data: any) => {
dispatch({ type: 'GET_ALL_RECORDS', data: data.docs })
return data.docs;
})
}
return (
<ul>
<li>Render article list here</li>
</ul>
)
}
// Reducer function
// ========================
function articleReducer(state: any, action: any) {
switch (action.type) {
case "GET_ALL_RECORDS":
return {
...state,
articles: action.data,
reRender: false
}
}
default:
return state;
}
}
但是当我使用路由器切换到上述任何组件时,它会再次执行 API 调用。
我在useEffect 钩子中传递了[state.reRender],告诉react 只有在添加任何新项目或数据更新时才重新渲染组件。
在articleReducer 函数中我正在设置reRender: false。
如果您需要这方面的更多信息,请告诉我。
谢谢, 吉涅什·拉瓦尔
【问题讨论】:
-
Raval 先生您好,Steve K 的回答有用吗?我遇到了同样的问题......看到他的回答后,我正在尝试迁移 Context.js 中的一些 api 调用
-
嗨 @LD8,我没有机会尝试 Steve K 提供的解决方案。
-
感谢您的回复。那么你解决了这个问题?
-
是的,我注意到 useEffect() 方法有助于停止不必要的重新渲染该组件,当史蒂夫提到的正确使用时
标签: javascript reactjs api react-router