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

React自定义Hook:useEffect执行时机与useQuery数据更新异常问题

问题解答

1. useEffect是否会在return语句之前执行?

不会。React的执行流程是:先同步执行Hook/组件里的所有代码(包括return语句,完成本次渲染),等渲染完成、DOM更新后,才会去执行useEffect的回调函数。所以useEffect的执行时机永远在当前渲染的return之后。

2. 自定义Hook返回旧结果的问题解决

你的代码里完全没必要用useState和useEffect来包装useQuery的返回值,这多此一举反而导致了问题:

  • 当props变化时,useQuery会重新执行并返回新的data/loading/error/refetch,但你的result是通过useState初始化的,第一次return时,result还是旧的状态值,要等useEffect触发(渲染完成后)才会更新result,这就导致你拿到的是上一次的结果。

直接简化代码即可,去掉多余的useState和useEffect:

function useCustomHook(props) {
  const { data, loading, error, refetch } = useQuery(query, { variables: { props } });
  return { data, loading, error, refetch };
}

这样每次props变化,useQuery会自动重新请求,返回的就是最新的结果,完全不需要手动维护状态。

如果确实需要对useQuery的结果做额外处理后再返回,也不要用useState存储,直接在Hook里同步处理后返回即可,比如:

function useCustomHook(props) {
  const { data, loading, error, refetch } = useQuery(query, { variables: { props } });
  // 对data做同步处理
  const processedData = data ? transformData(data) : null;
  return { data: processedData, loading, error, refetch };
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:09:50