React基础之ReactRouter

一个路径path对于一个组件component,当我们在浏览器中访问一个path的时候,path对于的组件会在页面中渲染

npm i react-router-dom

抽象路由模块

在src下创建一个router目录,创建一个index.js入口文件

import Login from "../page/Login";

import Article from "../page/Article";

import { createBrowserRouter } from "react-router-dom";

const router=createBrowserRouter([

{

path:'/login',

element: <Login/>

},

{

path:'/article',

element: <Article/>

}

])

export default router

page下创建不同的组件文件夹

Article下的index.js与Login下的index.js差不多

const Login=()=>{

return <div>我是登录页</div>

}

export default Login

然后再src下的index.js入口文件中,使用该路由

import React from 'react';

import ReactDOM from 'react-dom/client';

import './index.css';

import reportWebVitals from './reportWebVitals';

import {RouterProvider } from 'react-router-dom';

//导入路由组件

import router from './router' ;

const root = ReactDOM.createRoot(document.getElementById('root'));

root.render(

< React.StrictMode >

< RouterProvider router = { router } ></ RouterProvider >

</ React.StrictMode >

);

reportWebVitals();


路由导航

由一个组件跳转到另外一个组件

1.声明式导航

import { Link } from "react-router-dom"

const Login=()=>{

return(

<div>

我是登录页

< Link to = "/article" > 跳转到文章页 </ Link >

</div>

)

}

export default Login

2.编程式导航

调用useNavigate钩子得到导航方法,通过调用方法以命令式的形式进行路由跳转

import { useNavigate } from "react-router-dom"

const Login=()=>{

const navigate=useNavigate()

return(

<div>

我是登录页

<button onClick={()=>navigate('/article')}>跳转到文章页</button>

</div>

)

}

export default Login


路由传参

方法1.saerchParams传参

传入参数

import { useNavigate } from "react-router-dom"

const Login=()=>{

const navigate=useNavigate()

return(

<div>

我是登录页

<button onClick={()=>navigate('/article')}>跳转到文章页</button>

< button onClick = { () => navigate ( '/article?id=1001&name=jack' ) } > searchParams 传参 </ button >

</div>

)

}

export default Login

接收参数

import { useSearchParams } from "react-router-dom"

const Article=()=>{

const [ params ]= useSearchParams ()

const id = params . get ( 'id' )

const name = params . get ( 'name' )

return <div>我是文章页,{id},{name}</div>

}

export default Article

方法2 params传参

注意:需要在路由配置中设置对应的参数映射

传入参数

import { useNavigate } from "react-router-dom"

const Login=()=>{

const navigate=useNavigate()

return(

<div>

我是登录页

<button onClick={()=>navigate('/article')}>跳转到文章页</button>

< button onClick = { () => navigate ( '/article/1001/jack' ) } > params 传参 </ button >

</div>

)

}

export default Login

路由中配置映射

import Login from "../page/Login";

import Article from "../page/Article";

import { createBrowserRouter } from "react-router-dom";

const router=createBrowserRouter([

{

path:'/login',

element: <Login/>

},

{

path:'/article/:id/:name',

element: <Article/>

}

])

export default router

接收参数

import { useParams, useSearchParams } from "react-router-dom"

const Article=()=>{

const params = useParams ()

const id = params . id

const name = params . name

return < div > 我是文章页 , { id } , { name } </ div >

}

export default Article


路由嵌套

1.在路由配置中配置配置一级路由与它的Children

import Login from "../page/Login";

import Article from "../page/Article";

import { createBrowserRouter } from "react-router-dom";

import Layout from "../page/Layout";

import Board from "../page/Board";

import About from "../page/About";

const router=createBrowserRouter([

{

path: '/' ,

element: < Layout /> ,

children: [

{

path: 'board' ,

element: < Board />

},

{

path: 'about' ,

element: < About />

}

]

},

])

export default router

2.在一级路由处,配置二级路由出口

import { Link, Outlet } from "react-router-dom"

const Layout=()=>{

return(

<div>

我是一级路由Layout

<Link to="/board">面板</Link>

<Link to="about">关于</Link>

{/* 配置二级路由出口 */}

<Outlet/>

</div>

)

}

export default Layout


默认二级路由配置

也就是已进入到这个一级路由,就会显示这个二级路由的渲染,但是路径不发生变化

index的路由配置为

import Login from "../page/Login";

import Article from "../page/Article";

import { createBrowserRouter } from "react-router-dom";

import Layout from "../page/Layout";

import Board from "../page/Board";

import About from "../page/About";

const router=createBrowserRouter([

{

path:'/',

element:<Layout />,

children:[

{

// 默认二级路由设置

index: true ,

element:<Board/>

},

{

path:'about',

element:<About/>

}

]

}])

export default router

一级路由Layout为

import { Link, Outlet } from "react-router-dom"

const Layout=()=>{

return(

<div>

我是一级路由Layout

< Link to = "/" > 面板 </ Link >

<Link to="about">关于</Link>

{/* 配置二级路由出口 */}

<Outlet/>

</div>

)

}

export default Layout


404 路由配置

浏览器中的url路径在整个路由配置中找不到,我们就可以配置404兜底路由

1.设置一个NotFound组件

const NotFount=()=>{

return (

<div>页面消失了</div>

)

}

export default NotFount

2.在路由配置中添加path为*的路由配置项

import Login from "../page/Login";

import Article from "../page/Article";

import { createBrowserRouter } from "react-router-dom";

import NotFount from "../page/NotFound";

const router=createBrowserRouter([

{

path:'*',

element:<NotFount />

}

])

export default router


两种路由模式

也有history与hash两种模式

只需要将之前使用的 createBrowserRouter 修改成

createHashRouter

import Login from "../page/Login";

import Article from "../page/Article";

import { createBrowserRouter, createHashRouter } from "react-router-dom";

import Layout from "../page/Layout";

import Board from "../page/Board";

import About from "../page/About";

import NotFount from "../page/NotFound";

const router=createHashRouter ([

{

path:'/',

element:<Layout />,

children:[

{

// 默认二级路由设置

index:true,

element:<Board/>

},

{

path:'about',

element:<About/>

}

]

},

{

path:'/login',

element: <Login/>

},

{

path:'/article/:id/:name',

element: <Article/>

},

{

path:'*',

element:<NotFount />

}

])

export default router

相关推荐
陈随易7 分钟前
薪资跳动,VSCode实时显示今日打工收入
前端·后端·程序员
木西8 分钟前
使用 React Native 中的 FlatList 实现下拉刷新、滚动加载更多及定时刷新的长列表
react native·react.js
七灵微11 分钟前
【前端】SPA v.s. MPA
前端
fqq319 分钟前
CSS级联样式(基础知识)备忘录
前端·css
前端小巷子19 分钟前
JS深拷贝与浅拷贝
前端·javascript·面试
用户214118326360220 分钟前
N8N教程-手把手教你搭建 N8N 自动化工作流:从安装到云部署全流程实战
前端·vue.js
Mintopia44 分钟前
Three.js 环境贴图:给你的 3D 世界加个梦幻滤镜
前端·javascript·three.js
Mintopia1 小时前
JavaScript 里的光影魔术师:光线投射
前端·javascript·计算机图形学
呆呆的心1 小时前
深入探索 JavaScript 字符串处理:从基础到高阶 🚀
前端·javascript
zhangbao90s1 小时前
react-window:学习如何高效地渲染大型列表
前端·javascript·react.js