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版本路由算法改变,默认就是精确匹配(匹配完整路径),如果想匹配某一部分,在路径后加"/*"

例如:

复制代码
<Route path="/home/:id" element={<Home />}/>
则匹配
path = "/home/123"
path="/home/abc"

<Route path="/citylist/*" element={<CityList />}/>
则匹配
path="/citylist"
path="/citylist/123/abc"

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

4.<Link/><NavLink/>类似于a标签

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

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

复制代码
import React from 'react'
import "./App.css"
import {NavLink}from "react-router-dom"

function App() {
  return (
    <div className="App">
{/* 自动会传入isActive,要解构出来,判断是否选中,如果选中追加样式*/}
<NavLink className={({isActive})=>isActive?"active":""} to="/citylist">去城市列表</NavLink>
<NavLink className={({isActive})=>isActive?"active":""} to="/home">去首页</NavLink>
   
//style书写方式
<NavLink style={({isActive})=>{
return {
color:isActive?"red":"black"
}
} to="/home">去首页</NavLink>
    </div>
  );
}

export default App;

效果如下:

5.新老版本重定向

老版本:<Redirect to="/login" />

新版本:使用Navigate 进行重定向<Route path="/" element={<Navigate to="/home" />/>,相当于push,会有历史记录,如果<Route path="/" replace element={<Navigate to="/home" />/>使用replace,无历史记录。

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

7.useRoutes声明式的路由

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

复制代码
import React from 'react';
import ReactDOM from 'react-dom/client';
// import './index.css';

import App from './App';
// 1.引入BrowserRouter路由模式
import {BrowserRouter  } from 'react-router-dom'

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    {/* 2.使用 */}
    <BrowserRouter >
    <App />
    </BrowserRouter >
  </React.StrictMode>
);

②router->index.js文件

复制代码
const OutRoutes=()=>{
    const routes=useRoutes([
        {
            path:"/home",
            element:<Home/>,
            // home组件内使用Outlet添加出口,以显示子组件内容,
            // 注意:子组件不需加绝对路径"/",否则会报错,使用相对路径
            children:[
                {
                    path:"detail",
                    element:<Detail/>
                }
            ]  
        },
        {
            path:"/citylist",
            element:<CityList/>
        },
//* 404页面,匹配不符合路径
        {
            path:"*",
            element:<NotFound/>
        }
    ])
    return routes
}

export default OutRoutes

③App.js文件

复制代码
import React, { Suspense } from 'react'
import IndexRouter from "./router"
function App() {
  return (
    <div className="App">
 {/* 使用路由懒加载,渲染页面的时候可能会有延迟,但使用了Suspense之后,可优化交互。 */}
      {/* 注意:<IndexRouter></IndexRouter>要用标签的形式,因为他是组件 */}
    <Suspense><IndexRouter></IndexRouter></Suspense>
    </div>
  );
}

export default App;

8.编程式的路由

老版本:

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

函数组件:useHistory()

新版本:

useNavigate()

复制代码
import React from 'react'
import { Link,useNavigate } from 'react-router-dom'

export default function CityList() {
    const naviate = useNavigate();
   const jump=()=>{
        naviate("/home/detail");//push的方式
        // naviate("/home/detail",{replace:true})replace方式
    }
    return (
        <div>
            城市列表
                <Link to="/home">去home页面</Link>
                <button onClick={()=>jump()}>跳转</button> 
        </div>
    )
}

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

复制代码
// push跳转的三种携带参数方式
// 1.携带params参数
Navigate(`/home/c1/${id}/${title}`)  ==>     useParams()
//2.携带search参数
Navigate(`/home/c1?id=${id}&title=${title}`) ==> useSearchParams()
//3.携带state参数
Navigate("/home/c1",{state:{id,title}}) ==>  useLocation()

//replace跳转的三种携带参数方式
// 1.携带params参数
Navigate(`/home/c1/${id}/${title}`,{replace:true})
// 2.携带search参数
Navigate(`/home/c1?id=${id}&title=${title}`,{replace:true})
//3.携带state参数
Navigate("/home/c1",{state:{id,title},replace:true})

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

相关推荐
萧行之1 小时前
可视化技术复盘:从图形语法看 D3、Vega-Lite、ECharts、Observable Plot
前端·学习·数据可视化
尾善爱看海9 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
驳是10 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
GreenTea10 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
星云API技术支持10 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者10 小时前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn11 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
计算机魔术师12 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端
计算机魔术师13 小时前
OpenAI的AI代理偷偷给RubyGems下毒,我们却毫无察觉
前端
甲维斯13 小时前
0代码,0建模,3句话开发一个3D游戏!
前端·游戏·游戏开发