React路由问题Uncaught Error: useLocation() may be used only in the context of a <Router> component.

react-router-dom版本:6.16.0,出现问题代码如下:

index.js:渲染App.jsx

import React from "react";
import * as ReactDom from "react-dom/client";
import App from "./demo03_路由/App";

const element = document.querySelector('#root');

const root = ReactDom.createRoot(element);

root.render(
        <App />
)

App.jsx:问题就在这句报错<NavLink className='app-container-link'  to="/about" >About</NavLink>,因为这个需要用在一个Router上下文中,而react没有检测到所以抛出标题中的错误,解决方法很简单,请查看下面

import './App.css'
import {Route, NavLink, Routes, Router} from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";

export default function App(){
    return (
        <div className="app-container">
            <p className="app-container-title">React Router Demo</p>
            <hr/>
            <div className="app-container-content">
                <div>
                    {/*
                    路由链接:相当于a标签切换页面
                     */}
                    <NavLink className='app-container-link'  to="/about" >
                        About
                    </NavLink>
                    <NavLink  className='app-container-link'  to="/home">
                        Home
                    </NavLink>
                </div>
                <div className="app-container-content-page">
                    {/*
                   Routes:管理Route标签,其中如果有路径匹配到了Route,就不会继续匹配
                       假如路径为/about下面有两个匹配上一个就不会继续匹配
                        <Route path="/about" element={<About/>}/>
                        <Route path="/about" element={<Home/>}/>
                   Route:相当于一个map,key为路径value是组件(页面)
                        path:路径映射
                        element:要展示的组件
                   NavLink的to属性不能重复,且Route的path需要加上前斜线
                */}
                    <Routes>
                        <Route  path="/about" element={<About/>}/>
                        <Route  path="/home" element={<Home/>}/>
                    </Routes>
                </div>
            </div>
        </div>)

解决方法:改变index.js,增加Router上下文,为什么出问题:NavLink 组件需要 Router 组件提供的上下文信息才能正常工作,主要原因有:

  1. NavLink 组件内部使用了 React Router 的 hook - useResolvedPath:useResolvedPath 会从CONTEXT 中解析路径信息。所以 NavLink 需要 Router 提供的 CONTEXT 才能获取到解析后的路径。
  2. NavLink 的 active 样式依赖 location 信息:NavLink 的 activeClassName 和 isActive 属性都依赖当前的 location 信息来判断是否应用 active 样式。这个 location 信息只能从 Router 的 CONTEXT 获取。
  3. Router 管理整个应用的导航:Router 管理着整个单页应用的路由和导航。NavLink 对导航的响应需要依赖 Router 的管理。
root.render(
    <BrowserRouter>
        <App />
    </BrowserRouter>
)
//或者
root.render(
    <HashRouter>
        <App />
    </HashRouter>
)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值