v5和v6的区别
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
使用 <Routers>
包裹 来替代之前版本的<switch>且Route必须被包裹在Routes中
<Route path="/pd3" component={Channel3}></Route>
改为
<Route path="/pd3" element={<Channel3/>}></Route>
//component
改成element且内部写成组件形式(不能写成函数,否则会报错)
//useNavigate代替useHistory
//useNavigate()只可以用在<路由器>上下文的组件中。
1.路由组件
(1-1) v6 方式一 react-router-dom 常规 (1-2) v6 方式二 react-router-dom 使用 useRoutes
2.页面跳转
(2-1) Link 组件跳转 (2-2) useNavigate hooks跳转,代替useHistory
3.获取路由的参数
(3-1) useParams 获取动态路由的值 (3-2) useSearchParams 获取查询字符串的值 (3-3) useLocation 获取上一个页面传递进来的 state 参数 v5、v6一样
1.路由组件
BrowserRouter:引用不变
Routes:替换 v5 的 Switch 组件
Route:引用不变。参数 element 替换 v5 的 component、render 组件
(1-1) 创建 src/routers/index.js
import Home from '../views/Home'; import About from '../views/About' import Err404 from '../views/Err404' const routers = [ { title: '首页', path: '/', component: Home, }, { title: '关于', path: '/inbox', component: About, }, { title: '404', path: '/inbox', component: Err404, } ]; export default routers;
(1-2) 调用
v6 方式一 react-router-dom 常规(推荐 - 可以设置title更方便)
// v6 方式一
import React from 'react'; import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import routers from './routers'; const App = () => { return ( <Router> <Routes> // 不是老版本的:Switch {routers.map((item, index) => { return ( <Route key={index} exact path={item.path} element={<item.component />} // 不是老版本的:component 或 render // onEnter、onBeforeMount、onMounted事件,会在组件初始化时执行一次,切换路由不执行 // 若 修改 document.title 查看文档:https://blog.csdn.net/weixin_44461275/article/details/122843160 /> ); })} </Routes> </Router> ); }; export default App;
//v5
import React from 'react'; import { BrowserRouter as Router, Switch, Route } from 'react-router-dom'; import routers from './routers'; const App = () => { return ( <Router> <Switch> {routers.map((item, index) => { return ( <Route key={index} exact path={item.path} render={() => { // 推荐使用 render 不用 component document.title = item.title; return <item.component />; }} //或: //component={<item.component />} /> ); })} </Switch> </Router> ); }; export default App;
v6 方式二 react-router-dom + 使用 useRoutes
//路由json组件 import Layout from '../layout' import About from '../views/About' import Home from '../views/Home' import AboutIndex from '../views/About/Component/AboutIndex' import AboutList from '../views/About/Component/AboutList' import Error404 from '../views/Error404' const routes = [ { path: "/", element: <Layout />, children: [ { index : true, element: <Home /> }, { path: "/about", element: <About />, children: [ { index : true, element: <AboutIndex />}, { path : "/about/:id", element :<AboutList />} ] }, ] }, { path: "*", element: <Error404 />, } ] export default routes //app.js import React from 'react'; import { BrowserRouter as Router, useRoutes } from 'react-router-dom'; import routers from '../routers'; function App() { const GetRoutes = () => useRoutes(routers); //一定要是函数内 return ( <Router> <GetRoutes /> </Router> ); } export default App;
2.页面跳转
(2-1) Link 组件跳转
import React from "react"; import { Link } from "react-router-dom"; function DEMO() { return ( <Link to="/aaa">点击跳转页面</Link> ); }
export default DEMO;
(2-2) useNavigate hooks跳转,代替useHistory
import React from "react"; import { useNavigate } from "react-router-dom"; function DEMO() { const navigate = useNavigate(); // 点击跳转页面 function hrefAaa() { navigate('/aaa') } // history replace模式 function hrefReplace() { navigate("/aaa", { replace: true }); } // history.go(-1) function historyBack() { navigate(-1); } // 跳转带参数 function hrefState() { navigate("/test", { state: { test: 111 }, }); } return ( <> <div onClick={hrefAaa}>点击跳转页面</div> <div onClick={hrefReplace}>history replace模式</div> <div onClick={historyBack}>返回上一个页面</div> </> ); } export default DEMO;
3.获取路由的参数
useParams 获取动态路由的值 useSearchParams 获取查询字符串的值 useLocation 获取上一个页面传递进来的 state 参数 v5、v6一样 import React,{ useEffect } from "react"; import { useParams, useSearchParams, useLocation } from "react-router-dom"; export default function GoodsDetail() { const params = useParams(); // 获取动态路由的值 const [searchParams, setSearchParams] = useSearchParams(); // 获取查询字符串的值 const location = useLocation(); // 获取上一个页面传递进来的 state 参数 useEffect(() => { // 一个对象,key 为动态字符串的 key console.log(params); // {id: '123'} console.log(location.state); // { test: 111 } 上一个页面带参获取 非url上面的search // 输入 http://localhost:3000/goods/123?name=1111 console.log(searchParams.get("name")); // 111 }, []); const handleSetSearch = () => { // 新增-修改 setSearchParams({ keyName: 2222 }); // /aaa?keyName=2222 }; return ( <div onClick={handleSetSearch}>Page</div> ); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?