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

React中useNavigate跳转路由后页面未刷新数据不更新问题

问题原因与修复方案

问题原因

  • React Router 中,当路由路径(path)未变化,仅查询参数(query params)改变时,组件不会重新挂载,只会更新location对象
  • 你的useEffect依赖数组为空,仅在组件首次挂载时执行一次,后续查询参数变化不会触发它重新执行
  • 初始化时创建的query变量是闭包捕获的旧值,不会随URL更新而自动同步

修复方案1:给useEffect添加正确依赖项

将location.search加入useEffect的依赖数组,同时把URLSearchParams的创建移到useEffect内部,确保每次都能获取最新的查询参数:

let location = useLocation();
const navigate = useNavigate();

useEffect(() => {
  const getUser = async () => {
    const query = new URLSearchParams(location.search);
    const res = await axios.get('http://localhost:8082/api/getUserInfo', {
      params: {
        id: query.get("id"),
      },
      withCredentials: true,
    })
    setVisitor(res.data.visitor);
    setUser(res.data.user);
  }
  getUser();
}, [location.search])

修复方案2:使用React Router的useSearchParams钩子(推荐)

React Router v6+提供了专门处理查询参数的useSearchParams钩子,它会自动监听参数变化,无需手动处理location:

import { useSearchParams, useNavigate } from 'react-router-dom';

const Profile = () => {
  const [searchParams] = useSearchParams();
  const navigate = useNavigate();

  useEffect(() => {
    const getUser = async () => {
      const userId = searchParams.get("id");
      const res = await axios.get('http://localhost:8082/api/getUserInfo', {
        params: { id: userId },
        withCredentials: true,
      })
      setVisitor(res.data.visitor);
      setUser(res.data.user);
    }
    getUser();
  }, [searchParams])

  // 组件其他逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:24:25