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

如何在Prop变化时触发自定义Hook重新执行?

问题解决:自定义useHttp Hook在参数变化时不重新触发请求

你编写的useHttp Hook在主页面调用时正常工作,但在子组件中传入随用户操作变化的selectedId生成动态URL时,Hook仅在初始渲染时执行一次,不会随着URL变化重新发起请求。

问题原因

问题出在useEffect的依赖数组上——你给的是空数组[],这会让React认为这个effect没有任何依赖项,只会在组件首次挂载时执行一次,后续即使传入的url参数发生变化,也不会触发effect重新执行。

解决方案

不需要重写useEffect的逻辑,只需要把url添加到useEffect的依赖数组中即可:

修改后的useHttp代码:

import { useEffect, useState } from "react";

export function useHttp({ url }: { url: string }) {
  const [data, setData] = useState<any>(null);

 useEffect(() => {
    const controller = new AbortController();
    const signal = controller.signal;
    fetch(url, { signal })
      .then((res) => res.json())
      .then((data) => setData(data))
      .catch((err) => {
        if (err.name === "AbortError") {
          console.log("successfully aborted");
        } else {
          // handle error
        }
      });

    return () => {
      controller.abort();
    };
  }, [url]); // 将url加入依赖数组

  return data ;
}

效果说明

把url加入依赖数组后,React会监听url的变化:每当子组件的selectedId更新导致url改变时,useEffect就会重新执行,发起对应ID的用户数据请求;同时,之前未完成的请求会被controller.abort()终止,避免无效的网络请求和状态更新冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:35:16