• React v6(仅支持函数组件,不支持类组件)与v5版本路由使用详情和区别(详细版)


    1.路由安装(默认安装最新版本6.15.0)

    npm i react-router-dom

    2.路由模式

    有常用两种路由模式可选:HashRouter 和 BrowserRouter。

    ①HashRouter:URL中采用的是hash(#)部分去创建路由。

    ②BrowserRouter:URL采用真实的URL资源,无#。

    3.常用路由组件和hooks

    注意:

    v5版本路由是模糊匹配,需加关键字exact和Switch实现精准匹配。

    v6版本路由算法改变,默认就是精确匹配(匹配完整路径),如果想匹配某一部分,在路径后加"/*"

    例如:

    1. <Route path="/home/:id" element={<Home />}/>
    2. 则匹配
    3. path = "/home/123"
    4. path="/home/abc"
    1. <Route path="/citylist/*" element={<CityList />}/>
    2. 则匹配
    3. path="/citylist"
    4. path="/citylist/123/abc"

    在v6中Route能够找到最优路径,并不需要像v5讲究先后顺序。

    4.类似于a标签

    老版本v5中NavLink可以设置激活状态时的样式,他有一个activeClassName或activeStyle。

    新版本v6中NavLink可以移除了老版本activeClassName或activeStyle,他有一个箭头函数,接收isActive,可以跳转但是不能使用以下方式激活样式

    1. import React from 'react'
    2. import "./App.css"
    3. import {NavLink}from "react-router-dom"
    4. function App() {
    5. return (
    6. <div className="App">
    7. {/* 自动会传入isActive,要解构出来,判断是否选中,如果选中追加样式*/}
    8. <NavLink className={({isActive})=>isActive?"active":""} to="/citylist">去城市列表</NavLink>
    9. <NavLink className={({isActive})=>isActive?"active":""} to="/home">去首页</NavLink>
    10. //style书写方式
    11. <NavLink style={({isActive})=>{
    12. return {
    13. color:isActive?"red":"black"
    14. }
    15. } to="/home">去首页</NavLink>
    16. </div>
    17. );
    18. }
    19. export default App;

    效果如下:

    5.新老版本重定向

    老版本:

    新版本:使用Navigate 进行重定向/>,相当于push,会有历史记录,如果/>使用replace,无历史记录。

    6.路由出口与占位(),不做过多赘述。

    7.useRoutes声明式的路由

    ①.index.js文件引入并使用

    1. import React from 'react';
    2. import ReactDOM from 'react-dom/client';
    3. // import './index.css';
    4. import App from './App';
    5. // 1.引入BrowserRouter路由模式
    6. import {BrowserRouter } from 'react-router-dom'
    7. const root = ReactDOM.createRoot(document.getElementById('root'));
    8. root.render(
    9. <React.StrictMode>
    10. {/* 2.使用 */}
    11. <BrowserRouter >
    12. <App />
    13. </BrowserRouter >
    14. </React.StrictMode>
    15. );

    ②router->index.js文件

    1. const OutRoutes=()=>{
    2. const routes=useRoutes([
    3. {
    4. path:"/home",
    5. element:<Home/>,
    6. // home组件内使用Outlet添加出口,以显示子组件内容,
    7. // 注意:子组件不需加绝对路径"/",否则会报错,使用相对路径
    8. children:[
    9. {
    10. path:"detail",
    11. element:<Detail/>
    12. }
    13. ]
    14. },
    15. {
    16. path:"/citylist",
    17. element:<CityList/>
    18. },
    19. //* 404页面,匹配不符合路径
    20. {
    21. path:"*",
    22. element:<NotFound/>
    23. }
    24. ])
    25. return routes
    26. }
    27. export default OutRoutes

    ③App.js文件

    1. import React, { Suspense } from 'react'
    2. import IndexRouter from "./router"
    3. function App() {
    4. return (
    5. <div className="App">
    6. {/* 使用路由懒加载,渲染页面的时候可能会有延迟,但使用了Suspense之后,可优化交互。 */}
    7. {/* 注意:<IndexRouter></IndexRouter>要用标签的形式,因为他是组件 */}
    8. <Suspense><IndexRouter></IndexRouter></Suspense>
    9. </div>
    10. );
    11. }
    12. export default App;

    8.编程式的路由

    老版本:

    类组件:this.props.history.push("/home")

    函数组件:useHistory()

    新版本:

    useNavigate()

    1. import React from 'react'
    2. import { Link,useNavigate } from 'react-router-dom'
    3. export default function CityList() {
    4. const naviate = useNavigate();
    5. const jump=()=>{
    6. naviate("/home/detail");//push的方式
    7. // naviate("/home/detail",{replace:true})replace方式
    8. }
    9. return (
    10. <div>
    11. 城市列表
    12. <Link to="/home">去home页面</Link>
    13. <button onClick={()=>jump()}>跳转</button>
    14. </div>
    15. )
    16. }

    9.路由跳转,参数携带以及获取路由参数的三种方式

    1. // push跳转的三种携带参数方式
    2. // 1.携带params参数
    3. Navigate(`/home/c1/${id}/${title}`) ==> useParams()
    4. //2.携带search参数
    5. Navigate(`/home/c1?id=${id}&title=${title}`) ==> useSearchParams()
    6. //3.携带state参数
    7. Navigate("/home/c1",{state:{id,title}}) ==> useLocation()
    8. //replace跳转的三种携带参数方式
    9. // 1.携带params参数
    10. Navigate(`/home/c1/${id}/${title}`,{replace:true})
    11. // 2.携带search参数
    12. Navigate(`/home/c1?id=${id}&title=${title}`,{replace:true})
    13. //3.携带state参数
    14. Navigate("/home/c1",{state:{id,title},replace:true})

    注意:新版本类组件如果想获取以上三种获取参数的方式,要么使用函数组件,要么使用高阶组件。

  • 相关阅读:
    windows中使用curl
    浅谈MySQL的sql_mode
    微服务学习(六):实现SSH通信
    面试系列Redis:Redis持久化的方式
    12-js事件补充
    Web漏洞之文件上传(方式总结)
    【教学类-40-02】A4骰子纸模制作2.0(统计表、棋盘)
    Qt获取当前时间日期、设置时间日期
    pom.xml中的配置无法被yaml读取
    tensor.view().permute()
  • 原文地址:https://blog.csdn.net/qq_72760247/article/details/132668247