React路由

本文详细介绍了如何在React应用中配置和使用React Router,包括安装依赖、设置BrowserRouter、使用Link和Route、实现导航跳转、处理参数传递、使用Navigate进行重定向、实现NavLink的高亮以及使用useRoutes创建路由表。同时讲解了嵌套路由和不同类型的参数传递方式,包括params、search和state参数。

配置路由

1.安装依赖

npm i react-router-dom

2.在index.js中BrowserRouter把<App />包裹住

3.在页面使用<Link>编写路由链接<Route>

注:使用<Route>注册路由,必须用<Routes>包裹住

useNavigate()函数式编程式路由跳转

注意:参数只能传state

1.导入useNavigate

import {useNavigate } from 'react-router-dom'
const navigate = useNavigate()

 //navigate (1) 前进1
 //navigate (-1) 后退1
 //detail是路由名称,使用路由表,子路由前面不能加'/'
 function detail(){
    navigate('detail',{
      replace:false,
      state:{
        id:123,
        name:'lxy',
        age:18
      }
    })
  }

类式编程式路由跳转、传参

## 跳转方式

   1.this.props.history.push()  //可以后退

   2.this.props.history.replace()  //不可以后退

   3.this.props.history.goBack()  //后退

   4.this.props.history.goForward()  //前进

   5.this.props.history.go()

## 1.params参数

        路由链接:this.props.history.push(`/home/18/lxy`)

        注册路由(声明参数):<Route path="/home/:age/:name" component={Home}/>

        接收参数:this.props.match.params参数

## 2.search参数

        路由链接:this.props.history.push(`/home?age=18&name=lxy`)

        注册路由(无需声明参数):<Route path="/home" component={Home}/>

        接收参数:

                1.导入qs库:import qs from "qs"

                2.this.props.location.search

## 2.search参数

        路由链接:this.props.history.push(`/home`,{age:18,name:'lxy'})

        注册路由(无需声明参数):<Route path="/home" component={Home}/>

        接收参数:this.props.location.state

        备注:刷新参数也在

Navigate(路由重定向)

1.导入

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

2.使用

<Route path="/" element={<Navigate to="/home" />} />

NavLink路由高亮,有两种写法

方式1:回调函数,isActive是自定义参数

<NavLink className={({isActive}) => isActive?'active_router':'NavLink'} to="/home">home</NavLink>

方式2:绑定方法

HTML:

<NavLink className={computedClassName} to="/about">about</NavLink>

JS:

  function computedClassName({ isActive }) {
    return isActive ? "active_router" : "NavLink";
  }

useRoutes路由表

1.在src目录下新建routes文件夹,在routes文件夹新建index.js(用于管理路由)

 routes/index.js文件

import Home from "../pages/Home";
import About from "../pages/About";
import { Navigate } from "react-router-dom";

const routes = [
  {
    path: "/home",
    element: <Home />,
  },
  {
    path: "/about",
    element: <About />,
  },
  {
    path: "/",
    element: <Navigate to="/home" />,
  },
];

export default routes;

页面使用:

嵌套路由

路由表:

注意:子路由的path的值不能加‘/’

页面使用:

注意:这里跳转子路由也不能加'/'

params参数(参数可见,需要声明)

传参数

<Link to={`detail/${item.id}/${item.name}/${item.age}`}>{item.name}</Link>

路由配置参数

{
    path: "detail/:id/:name/:age",
    element: <Detail />,
},

页面接收参数

import { useParams } from "react-router-dom";
  const{id,name,age} = useParams()

search参数(参数可见,不用声明)

传参数

<Link to={`detail?id=${item.id}&name=${item.name}&age=${item.age}`}>{item.name}</Link>

页面接收参数

import { useSearchParams } from "react-router-dom";
  const [search,setSearch] = useSearchParams()
  let id = search.get('id')
  const name = search.get('name')
  const age = search.get('age')

  //setSearch是修改search参数的方法
  function click(){
    setSearch('id=4&name=ddd&age=16')
  }

state参数(参数不可见,不用声明)

传参数

<Link to="detail" state={{id:item.id,name:item.name,age:item.age}}>{item.name}</Link>

页面接收

import { useLocation } from "react-router-dom";
const {id,name,age} = useLocation().state

### React 路由实现方法 React 本身并不直接提供路由功能,而是通过第三方库(如 `react-router-dom`)来实现页面之间的导航与状态管理。该库提供了多种路由模式和组件,能够满足不同应用场景的需求。 #### 哈希路由模式(HashRouter) 哈希路由使用 URL 中的 `#` 符号作为路径标识符,适用于不支持 HTML5 History API 的浏览器环境。在 React 中可以通过 `HashRouter` 组件启用此模式,并结合 `Route` 和 `Link` 组件进行页面跳转和渲染[^1]。以下是一个基本示例: ```jsx import React from 'react'; import { HashRouter, Route, Link } from 'react-router-dom'; function App() { return ( <HashRouter> <div> <ul> <li><Link to="/">Home</Link></li> <li><Link to="/about">About</Link></li> <li><Link to="/contact">Contact</Link></li> </ul> <hr /> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/contact" component={Contact} /> </div> </HashRouter> ); } function Home() { return <h2>Home</h2>; } function About() { return <h2>About</h2>; } function Contact() { return <h2>Contact</h2>; } ``` #### 使用 BrowserRouter 模式 除了哈希路由外,还可以使用基于 HTML5 History API 的 `BrowserRouter` 模式,它能生成更美观、语义化的 URL(如 `/home`)。这种模式依赖服务器端配置以确保刷新时页面正常加载。 #### 配置式路由封装 为了避免在组件中堆积过多路由逻辑,可以将路由配置集中管理。例如创建一个 `routes.jsx` 文件,定义所有路由及其对应的组件,并通过自定义函数处理权限验证等逻辑[^2]。 ```jsx // routes.jsx import { Navigate } from "react-router-dom"; import Login from "./pages/login/login"; import Home from "./pages/home/home"; export const routes = [ { path: "/", navigate: "/home" }, { path: "/login", component: <Login /> }, { path: "/home", component: <Home /> } ]; export const routeGuard = (component, path) => { if (path === "/login") { return component; } else { return localStorage.getItem("token") ? component : <Navigate to="/login" />; } }; ``` #### 嵌套路由路由匹配顺序 React 路由按照注册顺序进行匹配,通常先匹配一级路由,再进入子级路由。通过 `Switch` 和 `Route` 组合可以实现嵌套结构,并结合 `Redirect` 进行默认路径跳转[^3]。 ```jsx import React from 'react'; import { Route, Switch, Redirect } from 'react-router-dom'; import News from './News'; import Message from './Message'; export default class Home extends React.Component { render() { return ( <div> <h3>我是Home的内容</h3> <div> <ul className="nav nav-tabs"> <li><MyNavLink to="/home/news">News</MyNavLink></li> <li><MyNavLink to="/home/message">Message</MyNavLink></li> </ul> <Switch> <Route path="/home/news" component={News} /> <Route path="/home/message" component={Message} /> <Redirect to="/home/news" /> </Switch> </div> </div> ); } } ``` #### 自定义路由实现原理 React Router 底层依赖浏览器的 `history` 对象和 `onpopstate` 事件来监听前进/后退操作。开发者也可以基于 `createHashHistory` 或 `createBrowserHistory` 实现自定义的 `Router` 组件[^4]。 ```jsx import React from 'react'; import { Router } from '../react-router'; import { createHashHistory } from '../history'; class HashRouter extends React.Component { constructor(props) { super(props); this.history = createHashHistory(props); } render() { return ( <Router history={this.history}> {this.props.children} </Router> ); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值