You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

state变更时react-use的useAsync未执行?如何实现API重调?

问题分析与解决

核心问题

你用的react-use库的useAsync,第二个参数是依赖数组,目前传的是空数组[],这就限定了这个异步请求只会在组件首次挂载时执行一次。哪怕父组件的appTaskList/envTaskList变化导致TaskComponent重新渲染,只要依赖数组里的内容没更新,useAsync就不会重新触发请求。

另外你生成的query变量完全依赖传入的app和env,但这个变量也没被加入useAsync的依赖,所以即使app/env变了,query更新了,useAsync也感知不到,自然不会重新发起请求。

解决办法

把所有影响请求结果的变量都放进useAsync的依赖数组里,包括backendUrl、apiPath、query、fetch这些,其中最关键的就是app和env(它们变了会直接导致query变化)。

修改后的TaskComponent代码:

export const TaskComponent = ({ app, env }) => {
  const { fetch } = useApi(fetchApiRef);
  const config = useApi(configApiRef);
  const backendUrl = config.getString('backend.baseUrl');
  const apiPath = config.get('aws.path');
  const query = getQuery(useEntity().entity, env, app);

  // 把所有影响请求的变量加入依赖数组
  const { value, loading, error } = useAsync(async (): Promise<any[]> => {
    const response = await fetch(`${backendUrl}${apiPath}/tasks?${query}`);
    console.log("useAync execution")
    return await response.json();
  }, [backendUrl, apiPath, query, fetch]);

  const columns: TableColumn[] = parseTableData(value);

  if (loading) {
    return <Progress />;
  } else if (error) {
    return <ResponseErrorPanel error={error} />;
  }
  return (
    <div>
      <Table
        options={{ paging: false, padding: 'dense' }}
        data={testData10}
        columns={columns}
        title={`${app} ${env} task definitions`}
      />
    </div>
  );
}

补充说明

  • useAsync的依赖数组逻辑和React原生的useEffect、useCallback完全一致:数组里的任意变量变化,就会重新执行异步函数。
  • 一定要把异步函数内部用到的所有外部变量都加进依赖,不然会出现闭包问题,比如用旧的query发起请求,导致结果不符合预期。

内容的提问来源于stack exchange,提问作者gmilleo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:43:20