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

React Router 直接访问带参数路由失效 数据未加载问题求助

问题根因

你的 useEffect 本身没有问题,不管从哪个路由进入应用,App 组件挂载时都会触发这个空依赖的 useEffect 发起数据请求。问题出在**异步请求和渲染的时序差:

  • 直接访问/:id路由时,第一次渲染阶段请求还未返回,data 是初始值空数组,此时执行data.find的结果必然为null,Country 组件拿到的是空值,看起来就像数据没有初始化。等请求完成触发重渲染后,才能拿到正确的国家数据。

修复方案

  1. 增加加载状态和兜底展示
    给App组件新增loading状态,在数据请求完成前统一展示加载提示,避免给Country组件接收空值。
  2. 给路由组件增加空值校验,避免渲染报错。

修改后的代码示例:

const App = () => {
  const url = 'http://localhost:3001/data'
  const [data, setData] = useState([])
  const [loading, setLoading] = useState(true)

  useEffect(() => {
    console.log('useeffect in use');
    (async () => {
      const res = await axios.get(url)
      setData(res.data)
      setLoading(false)
    })()
  }, [])

  const match = useRouteMatch('/:id')
  const country = match 
    ? data.find(x => x.country === match.params.id)
    : null

  // 加载中展示提示
  if(loading) return <div>加载中...</div>

  return(
    <div className='container'>
      <Search data={data} />
      <Switch>
        <Route path='/:id'>
          {/* 加一层兜底,找不到对应国家时展示404 */}
          {country ? <Country country={country} /> : <div>未找到对应国家</div>}
        </Route>
        <Route path='/'>
          <div>Base</div>
        </Route>
      </Switch>
    </div>
  )
}

额外注意

如果你使用的是react-router的history模式,直接访问子路由时如果出现404错误,需要额外在后端配置路由 fallback 到index.html,否则会出现页面无法加载的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:36:04