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

React嵌套Router报错:如何多组件共用单个Router解决Link未定义问题

问题解决办法

核心原理

React Router的Link组件只需要处于同一个根Router的上下文范围内即可正常使用,不需要在每个用到Link的组件外层单独套Router,全应用只需要保留一个最外层的Router即可。你之前删除Navbar内的Router后报Link is not defined是因为你大概率同时删掉了Link的导入语句,和删除Router操作没有关联。

第一步:修改Navbar.js

  • 删掉BrowserRouter as Router的导入语句,仅保留Link的导入
  • 删掉组件返回值中包裹nav标签的<Router>和</Router>标签
    修改后的完整Navbar.js代码如下:
import React from 'react'
import { Link } from "react-router-dom"

export default function Navbar(props) {
    return (
        <nav className={`navbar navbar-expand-lg navbar-${props.mode} bg-${props.mode}`}>
            <div className="container-fluid">
                <a className="navbar-brand" href="/">{props.title}</a>
                <button className="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
                    <span className="navbar-toggler-icon"></span>
                </button>
                <div className="collapse navbar-collapse" id="navbarNav">
                    <ul className="navbar-nav">
                        <li className="nav-item">
                            <Link className="nav-link active" aria-current="page" to="/">Home</Link>
                        </li>
                        <li className="nav-item">
                            <Link className="nav-link" to="/about">About</Link>
                        </li>
                    </ul>
                </div>
            </div>

            <div className={`form-check form-switch text-${props.mode==='light'?'dark':'light'}`}>
                <input className="form-check-input" onClick={props.toggleMode} type="checkbox" role="switch" id="flexSwitchCheckDefault"/>
                <label className ="form-check-label" htmlFor="flexSwitchCheckDefault">Dark Mode</label>
            </div>
        </nav>
    )
}

第二步:修正App.js的Route写法(兼容性优化)

你当前使用的是React Router v6版本,原有Route的组件渲染写法不符合v6规范,不需要写component属性,直接把组件放在element属性中即可,修改后的Routes部分代码如下:

<Routes>
  <Route path="/About" element={<About/>} />
  <Route path="/" element={<TextForm mode={mode} showAlert={showAlert} heading="Enter Some Text:"/>} />
</Routes>

修改完成后,全应用只有App.js内的一个根Router,Navbar中的Link因为处于根Router的包裹范围内,会正常工作,既不会再报Router嵌套错误,也不会出现Link未定义的报错。

内容的提问来源于stack exchange,提问作者Ali Bin Naseer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:45:08