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

React路由中Footer组件报错问题求助

React路由组件报错问题解决

问题场景

我正在学习React,编写了基础路由示例,但浏览器抛出错误。

App组件代码

import About from './About';
import Home from './Home';
import { BrowserRouter as Router ,Routes, Route} from "react-router-dom";
import Footer from './Footer';

const App = () => 
    <Router>
        <Routes>
          
                    <Route path="/" exact element={<Home></Home>}></Route>
                    <Route path="/about" element={<About></About>}></Route>
                    <Footer></Footer>
          
        </Routes>
    </Router>


export default App

Footer组件代码

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


const Footer = () => <footer>

    <nav>
        <ul>
            <li>
                <Link to="/">Home</Link>
            </li>
            <li>
                <Link to="/about">About</Link>
            </li>
        </ul>
    </nav>

</footer> 

export default Footer

报错信息

Uncaught Error: [Footer] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>

尝试用Fragment包裹Routes内的组件后错误依旧:

<Router>
    <Routes>
            <Fragment>
                <Route path="/" exact element={<Home></Home>}></Route>
                <Route path="/about" element={<About></About>}></Route>
                {/* <Home></Home>
                <About></About> */}   
                <Footer></Footer>
            </Fragment>
    </Routes>
</Router>

问题原因

Routes组件的核心作用是根据路径匹配渲染对应路由,它的直接子元素只能是Route或React.Fragment。即使嵌套Fragment,Fragment内部的非Route组件(比如这里的Footer)依然会被判定为无效子元素——因为Routes只会识别其直接层级的Route节点。另外,Footer属于全局布局组件,本就不应该放在路由匹配容器Routes内部。

解决方法

将Footer移出Routes组件,放到Router内部、Routes之外,这样它会在所有路由页面中全局渲染,同时符合路由组件的规则:

修改后的App组件代码

import About from './About';
import Home from './Home';
import { BrowserRouter as Router ,Routes, Route} from "react-router-dom";
import Footer from './Footer';

const App = () => 
    <Router>
        <Routes>
            <Route path="/" element={<Home />}></Route>
            <Route path="/about" element={<About />}></Route>
        </Routes>
        {/* Footer放在Routes外部,Router内部,实现全局渲染 */}
        <Footer />
    </Router>

export default App

补充:React Router v6中已移除exact属性,默认路由匹配即为精确匹配,因此可以删掉path="/"上的exact。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:24:47