react-router-dom 6.x 版改动的坑

前言

✋🏻 先,说一下我为什么发这么一篇文章。一个月前刚用过react的路由插件。当时用了之后也没有什么报错。然后今天用,遇到了好多问题。后来才发现是更新了版本,好多用法都改变了。所以想写篇文章梳理一下,同时也让能看到这篇文章的 🐻 🌏 们,少百度一些报错。

我去npm官网看了下react-router-dom的发布版本,在最近一个月内一直在改动着。

image.png

遇到的报错

❌ 1.

在使用 <Switch>时,报错如下:

import logo from './logo.svg';
import './App.css';
import {BrowserRouter, Route, Routes, Switch} from 'react-router-dom';
import Home from './pages/Home/index';
import Login from './pages/login';
import Register from './pages/register'
import Nav from './pages/navigator'
function App() {
  return (
    <div className="App"> 
      <BrowserRouter>
        <Nav/>
        <Switch>
          <Route path="/" exact element={<Home/>} />
          <Route path="/login" exact element={<Login/>} />
          <Route path="/register" exact element={<Register/>} />
        </Switch>
      </BrowserRouter>
    </div>
  );
}

export default App;

image.png
翻译一下:就是在 react-router-dom 中没有导出 <Switch>

因为在v6版本中,<Switch>被换成了<Routes>

❌ 2.

在Route配置了path的路径 和 component的组件,依旧无法跳转。

<Route path="/register" exact component={Register} /> 

image.png
警告说,routeregister路径没有匹配到 element,这意味着它什么都不会渲染。

因为在v6中,component属性被替换成了element,并且需要传带标签的组件而不只是组件名称

 <Route path="/" exact element={<Home/>} />

❌ 3.

这个错误跟v6没什么关系。主要是我没去度过 react-router-dom的语法,都是复制用的。

image.png

我把导航写到了<BrowserRouter>外面,同时 Nav 组件中又使用了
react-router-domLink组件。

App.js

   <Nav/>
   <BrowserRouter>
        <Routes> 
          <Route path="/" exact element={<Home/>} />
          <Route path="/login" exact element={<Login/>} />
          <Route path="/register" exact element={<Register/>} />
        </Routes>
      </BrowserRouter>

nav.jsx

     <ul className="nav navbar-nav">
                <li className="active">
                  <Link to="/">Home</Link>
                </li>
                <li>
                  <Link to="/register">SVN</Link>
                </li>
                <li className="dropdown">
                  <Link to="/login" className="dropdown-toggle" data-toggle="dropdown">
                    Java
                  </Link>
                </li>
          </ul>

我们下篇文章详细学一下React Router

react-router-domReact框架用于处理路由的库,它提供了一种方便的方式来管理应用程序的不同页面之间的导航和状态。而import.meta.glob是ES模块的一个新特性,它可以用于动态地导入模块。 在react-router-dom 6,import.meta.glob可以用于动态地导入路由组件。它可以根据指定的模式匹配文件路径,并将匹配到的文件作为路由组件进行导入。这样可以方便地实现按需加载路由组件,提高应用程序的性能和加载速度。 具体使用方法如下: 1. 首先,在项目安装react-router-dom 6: ``` npm install react-router-dom@next ``` 2. 在需要使用import.meta.glob的地方,使用如下语法进行导入: ```jsx import { lazy } from 'react'; import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; const routes = import.meta.glob('/path/to/routes/*.jsx'); function App() { return ( <Router> <Routes> {Object.entries(routes).map(([path, component]) => { const routePath = path.replace('/path/to/routes', '').replace('.jsx', ''); const LazyComponent = lazy(component); return <Route key={routePath} path={routePath} element={<LazyComponent />} />; })} </Routes> </Router> ); } export default App; ``` 在上面的代码,`import.meta.glob('/path/to/routes/*.jsx')`会根据指定的模式匹配`/path/to/routes/`目录下的所有`.jsx`文件,并返回一个对象,其键是文件路径,值是对应的模块。 然后,我们使用`Object.entries(routes)`将对象转换为数组,并使用`map`方法遍历数组,生成对应的`Route`组件。在遍历过程,我们使用`lazy`函数将路由组件进行懒加载,以实现按需加载的效果。 这样,我们就可以根据文件路径动态地导入路由组件,并在应用程序进行路由配置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值