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

React路由报错:useRoutes()仅可在<Router>组件上下文使用

问题解决:React路由报错及页面无法加载的修复

核心问题分析

你遇到的报错useRoutes() may be used only in the context of a <Router> component,本质是所有路由相关组件必须被Router组件包裹,Routes和Route需要从Router获取上下文才能正常工作。另外你的App.js里还在用react-router-dom v5的写法,v6版本已经更改了Route的属性规则。

分步修复

1. 给App添加Router包裹(修改index.js)

从react-router-dom引入BrowserRouter(静态部署场景可改用HashRouter),把App组件包裹在其中:

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
// 新增:引入BrowserRouter并别名Router
import { BrowserRouter as Router } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    {/* 用Router包裹App,提供路由上下文 */}
    <Router>
      <App />
    </Router>
  </React.StrictMode>
);

2. 修正App.js的Route写法(适配v6版本)

react-router-dom v6中,Route不再使用component属性,改用element且需传入组件实例(如<TemplateList />而非TemplateList)。同时v6默认路由匹配为精确匹配,无需写exact:

import { Routes, Route } from 'react-router-dom'
import TemplateList from './components/TemplateList'
import TemplateDetails from './components/TemplateDetails'

function App() {
    return (
        <Routes>
            <Route path="/" element={<TemplateList />} />
            <Route path="/template/:id" element={<TemplateDetails />} />
        </Routes>
    )
}

export default App

3. 模板列表页添加跳转功能(TemplateList示例)

在列表组件中用Link实现点击跳转:

import { Link } from 'react-router-dom';

function TemplateList() {
  // 假设存在模板数据
  const templates = [
    { id: 1, name: "模板1", thumbnail: "/path/to/thumb1.jpg" },
    { id: 2, name: "模板2", thumbnail: "/path/to/thumb2.jpg" }
  ];

  return (
    <div className="template-list">
      {templates.map(template => (
        <div key={template.id} className="template-item">
          {/* 通过Link跳转并携带id参数 */}
          <Link to={`/template/${template.id}`}>
            <img src={template.thumbnail} alt={template.name} />
            <p>{template.name}</p>
          </Link>
        </div>
      ))}
    </div>
  );
}

export default TemplateList;

4. 模板详情页获取路由参数(TemplateDetails示例)

用useParams钩子获取路由中的id参数:

import { useParams } from 'react-router-dom';

function TemplateDetails() {
  // 提取路由中的id参数
  const { id } = useParams();

  return (
    <div className="template-details">
      <h1>模板详情 - ID: {id}</h1>
      {/* 根据id渲染对应模板内容 */}
    </div>
  );
}

export default TemplateDetails;

验证修复

完成以上修改后重启项目,点击模板缩略图即可正常跳转到详情页,路由功能将恢复正常。

内容的提问来源于stack exchange,提问作者code-8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:25