axios Redux store触发无限重渲染

nr9pn0ug  于 2023-11-18  发布在  iOS
关注(0)|答案(1)|浏览(156)

我有这个服务类来从后端获取数据。我在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”状态的组件。
有人能帮我吗?谢谢。

pod7payv

pod7payv1#

projectsList放在括号中意味着projectsList每次更改时useEffect都会再次运行。因为效果会更新projectsList,所以运行效果会导致它再次运行。projectsList不应该放在这些括号中。
你说你希望projectsList在你创建一个新项目的时候更新,我建议你这样做:当你做一些像创建一个新项目的事情的时候,在一个单独的调用中更新projectsList

相关问题