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

React路由动态子菜单URL变更仅首次点击视图更新问题求解

问题根因

当你在同一路由规则/service/:id下切换不同id时,<Service>组件不会触发卸载重挂载,仅会更新props中的路由参数。你当前的useEffect设置了空依赖数组,仅会在组件首次挂载时执行一次接口请求,后续id变化不会自动触发重新拉取数据,因此视图内容不会更新。

修复方案

修改Service.js文件中useEffect的依赖数组,将路由参数id加入依赖,当id变化时自动重新执行接口请求,同时建议添加请求取消逻辑,避免组件卸载后请求返回触发无意义的state更新。

修改后的Service.js代码

const Service = (props) =>{
   const [service, setservice] = useState([]);
   const id = props.match.params.id;
    React.useEffect(() => {
        // 声明AbortController用于取消请求
        const controller = new AbortController();
        const signal = controller.signal;

        fetch("http://127.0.0.1:8000/api/service/"+ id, { signal })
          .then(results => results.json())
          .then(res => {
            const service = res.data.service;
            setservice(service);
          })
          .catch(err => {
            // 忽略取消请求的报错
            if (err.name !== 'AbortError') {
              console.error('请求失败:', err);
            }
          });
        
        // 组件卸载/依赖变化时取消未完成的请求
        return () => controller.abort();
      }, [id]); // 加入id作为依赖,id变化时重新执行Effect
   return (
      <div>
      {
         service.map((service, index) =>(
         <div key={index}>
           <h6 className="heading ">{service.service_name}</h6>             
         </div>
         ))
       }
       </div>
);
}
export default withRouter(Service);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:06:05