我有一个应用程序,我试图在组件加载时发出网络请求,使用API调用设置项目ID,并通过zustand设置状态.此外,还有一些人呼吁收听网络插座升级,以使用结果更新前端的某些内容.

例如,

const Component = () => {
  const { setProjectIdStorage } = useProjectStore();

  const projectIdStorage = useProjectStore((state) => state.projectIdStorage);

  useEffect(() => {
    createProject();
  }, []);

 function createProject() {
    BackendClient.post(
      `projects`,
      { project_id: projectIdStorage },
      { headers: { "Content-Type": "application/json" } },
    )
      .then((response) => {
        setProjectIdStorage(response.data.project.id);
      })
      .catch((err) => {
        console.log("Failed to create project");
      });
  }

  useEffect(() => {
    socket.on("server_recommendation", onServerRecommendation);
    socket.on("server_code", onServerCode);
    return () => {
      socket.disconnect();
    };
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

const refreshProjectStates = (projectId: string | null) => {
    BackendClient.post(
      `projects/project_state`,
      { project_id: projectId },
      { headers: { "Content-Type": "application/json" } },
    ).then(async (response: any) => {
      const projectStates = response.data.project_states;
      setProjectStates(projectStates);
      if (projectStates.length > 0) {
        setActiveProjectState(projectStates[projectStates.length - 1]);
      }
    });
  };

const refreshRecommendations = (projectId: string | null) => {
    BackendClient.get(
      `recommendations?project_id=${projectId}`
    ).then((response) => {
      setRecommendations(response.data.recommendations);
    })    
  }

const onServerCode = () => {
    setLoading(false);
    refreshProjectStates(projectIdStorage);
    setPrompt("");
  };

  const onServerRecommendation = () => {
    refreshRecommendations(projectIdStorage);
  };
}

我遇到的问题是,在createproject()的第一个网络请求和项目ID被设置之后--当在刷新项目状态/刷新建议中进一步访问时,项目ID总是空的.然而,它似乎只有在页面刷新后才能起作用.

在本例中,我使用的是Zustand,但它似乎也无法正常react useState().

推荐答案

与所 Select 的初始projectIdStorage状态相比,onServerCodeonServerRecommendation都具有陈旧的闭合.

更新useEffect挂钩以使用对projectIdStorage值的依赖关系,以便服务器事件处理程序具有当前的项目ID值.

例如:

const projectIdStorage = useProjectStore((state) => state.projectIdStorage);

useEffect(() => {
  // Disconnect/close socket on component unmount
  return () => {
    socket.disconnect();
  };
}, []);

useEffect(() => {
  const refreshProjectStates = (projectId: string | null) => {
    BackendClient.post(
      `projects/project_state`,
      { project_id: projectId },
      { headers: { "Content-Type": "application/json" } },
    )
      .then(async (response: any) => {
        const projectStates = response.data.project_states;
        setProjectStates(projectStates);
        if (projectStates.length > 0) {
          setActiveProjectState(projectStates[projectStates.length - 1]);
        }
      });
  };

  const refreshRecommendations = (projectId: string | null) => {
    BackendClient.get(`recommendations?project_id=${projectId}`)
      .then((response) => {
        setRecommendations(response.data.recommendations);
      });    
  };

  const onServerCode = () => {
    setLoading(false);
    refreshProjectStates(projectIdStorage);
    setPrompt("");
  };

  const onServerRecommendation = () => {
    refreshRecommendations(projectIdStorage);
  };

  socket.on("server_recommendation", onServerRecommendation);
  socket.on("server_code", onServerCode);

  return () => {
    socket.off("server_recommendation", onServerRecommendation);
    socket.off("server_code", onServerCode);
  };
}, [projectIdStorage]);

Reactjs相关问答推荐

如何在react组件中使用formik进行验证

禁止直接访问Next.js中的页面,同时允许从应用程序内部访问

如何在物料界面react 的多选菜单中设置最大 Select 数限制

如何通过reactjs正确显示记录

更改点几何体的坐标会将其隐藏

Github 操作失败:发布 NPM 包

tRPC/react-query,在所有查询完成之前,组件不会收到任何 useQuery 的结果

Redux 工具包不更新状态

useMemo 依赖项的行为

我应该如何将字符串作为props 传递给 React 组件?

使用带有搜索字符串的全局过滤器时如何在 React-Table 中进行精确匹配?

React Native Realm 应用程序在发布构建后崩溃

Github 页面无法正确呈现 CSS,因为它是本地的

如何向 surveyjs 调查添加多个结尾?

使用 React.UseEffect 从 api 获取但我的清理返回不起作用

渲染的钩子比预期的少.这可能是由 React Hooks 中意外的提前返回语句引起的

使用 React 中的功能组件更改另一个组件的状态

React Hooks 表单在日志(log)中显示未定义的用户名

React useEffect hooks return () => cleanup() vs return cleanup

React 似乎在触发另一个组件时重新渲染了错误的组件