【React】React全家桶(八)React Router 6

本文详细介绍了ReactRouter6的主要变化,包括组件的更新,如用Routes替代Switch,新增的Navigation组件如Link、NavLink、Navigate,以及Hooks的使用,如useRoutes、useParams、useNavigate等。通过示例代码展示了如何配置路由、进行导航以及获取当前路由信息。此外,还解释了嵌套路由的处理和不同导航模式的区别。

1 React Router 6 概述

React Router 6以三个不同的包发布到 npm 上,它们分别为

  • react-router: 路由的核心库,提供了很多的组件、钩子。

  • react-router-dom: 包含react-router所有内容,并添加一些专门用于 DOM 的组件,例如 <BrowserRouter>等。

  • react-router-native: 包括react-router所有内容,并添加一些专门用于ReactNative的API,例如:<NativeRouter>等。

与React Router 5.x 版本相比,改变了什么

  • 内置组件的变化:移除<Switch/> ,新增 <Routes/>等。
  • 语法的变化:component={About} 变为 element={<About/>}等。
  • 新增多个hooks:useParamsuseNavigateuseMatch等。
  • 官方明确推荐函数式组件

说明

2 Component组件

2.1 router组件(BrowserRouter 、 HashRouter)

基于React Router的web应用,根组件应该是一个router组件(BrowserRouter、HashRouter),<BrowserRouter>HashRouter就是router根组件,用于包裹整个应用。<HashRouter>作用与<BrowserRouter>一样,但<HashRouter>修改的是地址栏的hash值。

< BrowserRouter 
  //  所有路由的基础地址
  basename = {
   
    optionalString } 
  // 如果设置为true,路由router将会在跳转的时候进行整个页面刷新
  forceRefresh = {
   
    optionalBool } 
  // 用来确认是否跳转,默认使用window.confirm
  getUserConfirmation = {
   
    optionalFunc }
  // location.key的长度,默认为6
  keyLength = {
   
    optionalNumber } 
>
</ BrowserRouter >

备注:6.x版本中<HashRouter><BrowserRouter> 的用法与 5.x 相同。

示例代码

import React from "react";
import ReactDOM from "react-dom";
import {
   
    BrowserRouter } from "react-router-dom";

ReactDOM.render(
  <BrowserRouter>
    {
   
   /* 整体结构(通常为App组件) */}
    <App/>
  </BrowserRouter>,root
);

2.2 路由匹配组件(Routes 、 Route)

  • v6版本中移出了先前的<Switch>,引入了新的替代者<Routes>

  • <Routes><Route>要配合使用,且必须要用<Routes>包裹<Route><Routes>会迭代它下面的所有<Route>子组件,并只渲染第一个路径匹配的,这样只要匹配到了第一个就不会再往下匹配了。当URL发生变化时,<Routes> 都会查看其所有子 <Route> 元素以找到最佳匹配并呈现组件 。

  • <Routes><Route>可由useRoutes()配置 “路由表”生成路由代替

  • 路由匹配是通过将 <Route>组件的path属性当前的location的pathname进行比较来完成的。 当一个<Route>匹配了 ,它所对应的组件内容将被渲染出来。

  • <Route caseSensitive> 属性用于指定匹配时是否区分大小写,增加caseSensitive就区分大小写。

  • <Route> 也可以嵌套使用,但需要通过 <Outlet> 组件来渲染其子路由。

示例代码

<Routes>
    /*path属性用于定义路径,element属性用于定义当前路径所对应的组件*/
    <Route path="/login" element={
   
   <Login />}></Route>
	/*用于定义嵌套路由,home是一级路由,对应的路径/home*/
    <Route path="home" element={
   
   <Home />}>
       /*test1 和 test2 是二级路由,对应的路径是/home/test1 或 /home/test2*/
      <Route path="test1" element={
   
   <Test/>}></Route>
      <Route path="test2" element={
   
   <Test2/>}></Route>
		</Route>
	//Route也可以不写element属性, 这时就是用于展示嵌套的路由 .所对应的路径是/users/xxx
    <Route path="users">
       <Route path="xxx" element={
   
   <Demo />} />
    </Route>
</Routes>

2.3 Navigation组件(Link、NavLink、Navigate)

Link

  • 作用: 修改URL,且不发送网络请求(路由链接)。

  • 注意: 外侧需要用<BrowserRouter><HashRouter>包裹。

示例代码

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

function Test() {
   
   
  return (
    <div>
    	<Link to="/路径">按钮</Link>
    </div>
  );
}

NavLink

  • 作用: 与<Link>组件类似,且可实现导航的“高亮”效果。

示例代码

// 注意: NavLink默认类名是active,下面是指定自定义的class

//自定义样式
<NavLink
    to="login"
    className={
   
   ({
    
     isActive }) => {
   
   
        console.log('home', isActive)
        return isActive ? 'base one' : 'base'
    }}
>login
</NavLink>

/*
	默认情况下,当Home的子组件匹配成功,Home的导航也会高亮,
	当NavLink上添加了end属性后,若Home的子组件匹配成功,则Home的导航没有高亮效果。
*/
<NavLink to="home" end >home</NavLink>

Navigate

  • 作用:只要<Navigate>组件被渲染,就会修改路径,切换视图。
  • push模式(默认):可以留下操作记录,不发生替换
  • replace模式:开启的路由不会留下操作记录,发生替换

示例代码

import React,{
   
   useState} from 'react'
import {
   
   Navigate} from 'react-router-dom'

export default function Home() {
   
   
	const [sum,setSum] = useState(1)
	return (
		<div>
			<h3>我是Home的内容</h3>
			{
   
   /* 根据sum的值决定是否切换视图 */}
			{
   
   sum === 1 ? <h4>sum的值为{
   
   sum}</h4> : <Navigate to="/about" replace />}
			<button onClick={
   
   ()=>setSum(2)}>点我将sum变为2</button>
		</div>
	)
}

2.4 Outlet

作用:当<Route>产生嵌套时,渲染其对应的后续子路由。

示例代码

routes/index.js

//路由表
import About from '../pages/About'
import Home from '../pages/Home'
import {
   
   Navigate} from 'react-router-dom'

export default [
	{
   
   
		path:'/about',
		element:<About/>
	},
	{
   
   
		path:'/home',
		element:<Home/>,
        children:[
          {
   
   
            path:'news',
            element:<News/>
          },
          {
   
   
            path:'message',
            element:<Message/>
          }
        ]
	},
	{
   
   
		path:'/',
		element:<Navigate to="/about"/>
	}
]

pages/Home.jsx

import React from 'react';
import {
   
    NavLink, Outlet } from 'react-router-dom';

export default function Home() {
   
   
  return (
    <div>
      <h2>Home组件内容</h2>
      <div>
        <ul className="nav nav-tabs">
          <li>
            <NavLink className="list-group-item" to="news"
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值