我有这个服务类来从后端获取数据。我在getProjects方法中发出一个get请求来获取一些数据,我使用axios:
export default class MissionService {
keycloak: KeycloakInstance
dispatch: AppDispatch
store
constructor(keycloak: KeycloakInstance){
this.store = useAppSelector((store) => store.xproj)
this.dispatch = useAppDispatch();
this.keycloak = keycloak;
}
async getProjects(){
if (!this.keycloak.token) return;
backendAPI.defaults.headers.common[
'Authorization'
] = `Bearer ${this.keycloak.token}`;
await backendAPI
.get('/mission/user')
.then(({ data }) => {
this.dispatch(setProjectList(data))
})
.catch((error) => errorNotification(error.response.data.message));
}
字符串
在接收到数据后,它会将数据发送到存储区。在我的存储区中,我只保存数据,仅此而已:
setProjectList: (state, action: PayloadAction<XProjProject[]>) => {
state.projectsList = action.payload
},
型
我想在打开特定组件时获取此数据:
const {
projectsList
} = useAppSelector((state) => state.xproj);
useEffect(() => {
missionService.getProjects()
}, [projectsList]);
型
但是如果我把“projectList”放在useEffect括号里,它会触发一个无限重渲染。每次都是向后端发出请求。我必须从括号中删除“projectsList”,但这不是我想要的,因为每次我创建一个新项目时,我都想更新使用“projectList”状态的组件。
有人能帮我吗?谢谢。
1条答案
按热度按时间pod7payv1#
将
projectsList
放在括号中意味着projectsList
每次更改时useEffect
都会再次运行。因为效果会更新projectsList
,所以运行效果会导致它再次运行。projectsList
不应该放在这些括号中。你说你希望
projectsList
在你创建一个新项目的时候更新,我建议你这样做:当你做一些像创建一个新项目的事情的时候,在一个单独的调用中更新projectsList
。