Advertisement

【React Router v6】这17个API,你真的都懂了吗?(建议收藏)

阅读量:

本文介绍了React的Routing组件及其相关钩子和配置方法,重点包括:
Component:

  • 用于包裹整个应用,支持地址栏的重写。
  • 功能相同,但修改地址栏的哈希值。
  • `配合使用,实现路由逻辑,支持多级路由和条件匹配。
    Hooks:
  • useRoutes()根据路由表动态创建组件。
  • useNavigate()实现编程式路由导航,支持前进、后退和状态管理。
  • useParams(), useSearchParams(), useLocation(), useMatch()分别用于获取当前路由的参数、搜索参数、位置信息和匹配信息。
  • useInRouterContext(), useNavigationType(), useOutlet(), useResolvedPath()提供路由上下文和导航状态的元数据。
    这些组件和钩子帮助开发者构建复杂的路由系统,支持按路径渲染组件、管理路由参数和实现动态导航功能。
在这里插入图片描述

😇本文目录� 😇

  • 组件

      1. <BrowserRouter>
      1. <HashRouter>
      1. <Routes /><Bring />
      1. <Link>
      1. <NavLink>
      1. <Navigate />
      1. <Outlet>
  • 拾plements

      1. useRoutes()
      1. useNavigate()
      1. useParams()
      1. useSearchParams()
      1. useLocation()
      1. useMatch()
      1. useInRouterContext()
      1. useNavigationType()
      1. useOutlet()
      1. useResolvedPath()

React–从基础到实战

React–从基础到实战

React–从基础到实战

🕹坚持创作✏️,一起学习📖,码出未来👨🏻‍💻!

在这里插入图片描述

Component

1.<BrowserRouter>

说明<BrowserRouter> 用于包裹整个应用;

复制代码
    const root = ReactDOM.createRoot(document.getElementById('root'))
    root.render(
      <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
      </React.StrictMode>,
    );

2.<HashRouter>

注解:其主要区别在于,<HashRouter>的作用与<BrowserRouter>相似,但其核心功能是调整地址栏的哈希值。

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


3.<Routes />与<Route />

v6版本已经取代了原有的<Switch />结构,引入了<Routes />组件。必须将<Route />嵌入到<Routes />组件内,以确保正确的路由结构。此外,<Route />组件类似于一个条件判断,当URL路径与<Route />匹配时,会显示对应的组件。该组件还支持一个caseSensitive属性,用于控制匹配时的区分大小写逻辑,其默认设置为关闭。每当URL发生变化时,<Routes />组件都会重新评估所有子<Route />以确保最佳匹配。此外,<Route />组件还可以嵌套使用,并且可以通过useRoutes()配置来管理路由表,但必须使用<Outlet>组件来渲染其子路由内容。

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

4.<Link>

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

外侧需要使用BrowserRouterHashRouter包裹。

示例代码

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

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

5.<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>

6.<Navigate />

作用 :只要<Navigate />组件被渲染,就会修改路径,切换视图。

replace属性用于控制跳转模式(push或者replace,默认是 push )

复制代码
    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 === 2 ? <Navigate to="/about" replace /> : <h4>当前sum的值是:{sum}</h4>}
      <button onClick={() => { setSum(2) }}>点我sum变为2</button>
    </div>
      )
    }

7.<Outlet>

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

示例代码

复制代码
    // 根据路由表生成对应的路由规则

    const element = useRoutes([
    	{
    		path:'/about',
    		element: <About />
    	},
      {
    path: '/home',
    element: <Home />,
    children: [
    	{
    		path: 'news',
    		element: <News />
      		}
    ]
      }
    ])
    
    // Home.jsx
    import React from 'react';
    import { Outlet } from 'react-router-dom';
    
    export default function Home() {
      return(
      	<div>
    	{/* 指定路由组件呈现的位置 */}
    	<Outlet />
    </div>
      )
    }

Hooks

1.useRoutes()

作用:根据路由表,动态创建<Routes><Route>

示例代码:

复制代码
    // 路由表配置:/src/routes/index.js
    import Home from '../pages/home'
    export default [
      {
    path: '/home',
    element: <Home />
      }
    ]
    // App组件
    import React from 'react';
    import { useRoutes,Link } from 'react-router-dom';
    import routes from './routes'
    function App() {
      const element = useRoutes(routes)
      return (
      	<div>
    	{/* 编写路由链接 */}
    	<Link to="/home">Home</Link>
      		{/* 注册路由 */}
    	{element}
    </div>
      )
    }

2.useNavigate()

功能:提供一个函数用于实现编程式路由导航。

示例代码:

复制代码
    import { useNavigate } from 'react-router-dom';
    export default function Demo() {
    	const navigate = useNavigate()
      const handle = () => {
    // 第一种使用方式:制定具体路径
    navigate('/login',{
      replace: false,
      state: { a:1, b:2 }
    })
    // 第二种使用方式: 传入number类型数值进行前进和后退,类似router v5中的history.go()方法
    navigate(-1) //后退
      	navigate(1) // 前进
      }
      return (
      	<div>
    	<button onClick={handle}>按钮</button>
    </div>
      )
    }

3.useParams()

该功能用于获取当前路由的匹配参数,类似于v5 router的this.props.match.params属性。


4.useSearchParams()

作用:用于读取和修改当前闻之的URL中的查询字符串,也就是search参数。

返回一个包含两个值的数组,内容分别为:当前的search参数、更新search参数的方法。

复制代码
>     const [search,setSearch] = useSearchParams()
>  
>  
>       
>  
>

5.useLocation()

作用:获取当前的location信息,相当于router v5中的this.props.location


6.useMatch()

作用:返回当前匹配信息,相当于router v5中的this.props.match

关于useParamsuseSearchParamsuseLocationuseMatch的具体说明


7.useInRouterContext()

当组件存在于环境中时,useInRouterContext钩子将判断为true,否则将判断为false。

什么是路由的上下文环境呢?比如,

复制代码
    <BrowserRouter>
      <App />
    </BrowserRouter>

这个App组件处于browserRouter标签的包裹之中,因此,这个App组件及其所有子组件都处于路由上下文中。

useInRouterContext()组件钩子能够确定组件是否嵌入到路由的上下文中。该钩子通过检查组件的生命周期和位置来确定其是否嵌入到路由的上下文中。

使用方式

复制代码
    import { useInRouterContext } from 'react-router-dom';
    console.log(useInRouterContext())
    若组件处于路由的上下文环境中(比如上面的App组件)
    则这个控制台输出为:true。
    //
    若组件不处于路由的上下文环境中,
    则控制台输出为:false。

8.useNavigationType()

  1. 作用:返回当前的导航类型(用户是如何来到当前页面的)。
  2. 返回值:POPPUSHREPLACE
  3. 备注:POP是指在浏览器中直接打开了这个路由组件(刷新页面)。

使用方式

复制代码
    import { useNavigationType } from 'react-router-dom';
    console.log(useNavigationType());

9.useOutlet()

作用:用来呈现当前组件中要渲染的嵌套路由。

示例代码

复制代码
    import { useOutlet } from 'react-router-dom';

    const result = useOutlet()
    console.log(result)
    
    // 如果嵌套路由没有挂载,则result为null;
    // 如果嵌套路由已经挂载,则展示嵌套的路由对象

10.useResolvedPath()

作用:给定一个URL值,解析其中的:path、search、hash值。

使用方式

复制代码
    import { useResolvedPath } from 'react-router-dom'
    console.log(useResolvedPath('/users?id=001&name=tom#qwe'))

输出结果为:

复制代码
    { pathname: '/users', search: '?id=001&name=tom', hash: '#qwe' }

全部评论 (0)

还没有任何评论哟~