【React】react-router v6 基础 (含代码)

React路由可以实现页面间的切换。
传送门:英文文档
中文教程:
https://www.reactrouter.cn/docs/getting-started/tutorial

1.基础使用

1.安装react-router

npm i react-router-dom@6

2.配置根组件app.js

import { React, lazy, Suspense } from "react";

// 导入 Route, Routes 等核心组件
import { Route, Routes, BrowserRouter ,HashRouter } from "react-router-dom";
import Home from "./components/Home";
import About from "./components/About";
import User from "./components/User";
import PageNotFound from "./components/PageNotFound";
import Recommond from "./components/Recommand";
import JapenAnimate from "./components/JapenAnimate";
import ChineseAnimate from "./components/ChineseAnimate";
import NewAnimate from "./components/NewAnimate";

function App() {
  return (
  	<BrowserRouter>
	    <Routes>
	      <Route path="/" element={<Navigate to={<Home />}></Route>
	      <Route path="/home" element={<Home />}>
	        <Route path="/" element={<Navigate to={<Recommond />} />
	        <Route path="recommand" element={<Recommond />} />
	        <Route path="new-animate" element={<NewAnimate />} />
	        <Route path="japan-animate" element={<JapenAnimate />} />
	        <Route path="chinese-animate" element={<ChineseAnimate />} />
	      </Route>
	      <Route path="/user" element={<User />} />
	      <Route path="/about" element={<About />} />
	      <Route path="*" element={<PageNotFound />} />
	    </Routes>
  	</BrowserRouter>
  );
}

export default App;

两种常用Router:BrowserRouter 、HashRouter
作用:包裹整个应用,只要在页面中写在最外层一次就行了。
BrowserRouter (推荐)
使用H5的history.pushState API实现 ,url显示效果(http://localhost:3000/home)
HashRouter
使用URL的哈希值实现,url显示效果(http://localhost:3000/#/home

配置路由语法:

    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/user" element={<User />} />
      <Route path="/about" element={<About />} />
    </Routes>

Routes标签包裹着一个个路由,path对应路径,element对应导入的组件。

配置当无匹配项时,额外的404页面:

 <Route path="*" element={<PageNotFound />} />

4.配置Link链接(如果是导航的话推荐用NavLink)

// 导入NavLink
 import { NavLink } from "react-router-dom";

-------------
 // 使用,to表示跳转链接
  <NavLink to='/home'>

5.配置导航激活状态

1) 设置active的css

Link 或者 NavLink都会被编译成a标签,并且激活时会自带一个active的类,简单的css,我们可以直接设置该a标签的active类属性。

2)通过activeStyle={} api属性设置激活时候的属性。
3)通过回调函数可以设置更复杂的操作(如导航激活图片的更换)
<NavLink to='/home'>
	{(isActive)=>{
		// isActive表示该Link是否处于激活状态
	}
</NavLink>

6. 基本的嵌套路由

用法参考下面

	    <Routes>
	      <Route path="/" element={<Navigate to={<Home />}></Route>
	      <Route path="/home" element={<Home />}>
	        <Route path="/" element={<Navigate to={<Recommond />} />
	        <Route path="recommand" element={<Recommond />} />
	        <Route path="new-animate" element={<NewAnimate />} />
	        <Route path="japan-animate" element={<JapenAnimate />} />
	        <Route path="chinese-animate" element={<ChineseAnimate />} />
	      </Route>
	      <Route path="/user" element={<User />} />
	      <Route path="/about" element={<About />} />
	      <Route path="*" element={<PageNotFound />} />
	    </Routes>

Outlet占位:
注意在使用时,需要配合 Outlet 标签对子路由进行占位,Outlet你可以决定放在父路由页面的任意位置。
语法

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

// 占位
<Outlet />

举个例子:

import TabBar from "../../common/TabBar";
import Tabs from "../Tabs";
import { Outlet } from "react-router-dom";
import SearchBar from "../SearchBar/index";
function Home() {
  return (
    <div>
      <div>
        <SearchBar />
        <Tabs />
        <Outlet />
        <TabBar />
      </div>
    </div>
  );
}
export default Home;

我把Outlet放在tabs的下面,tabbar的上面,就是这种效果:
在这里插入图片描述

默认渲染一级路由 path=‘/’
默认渲染二级路由,去掉path,添加index属性。

 <Route index element={<Recommond />} />

2.进阶使用

编程式导航跳转

作用:通过js编程的方式进行路由页面跳转,比如从登录界面跳转到关于页。
语法说明:
1.导入useNavigate钩子函数
2.执行钩子函数得到跳转函数
3.执行跳转函数完成跳转

注意:如果在跳转时不想加历史记录,可以添加额外参数replace为true

import { useNavigate } from "react-router-dom";
------------------------
  const navigate = useNavigate();
  const goHome = () => {
    navigate("/home", { replace: true });
  };
------------------------------
      <button onClick={goHome}></button>

跳转携带参数:有时候不光需要跳转还需要传递参数。

  1. searchParams
    传参
navigate('/about?id=1001')

取参

let [params] = useSearchParams()
let id = params.get('id')
  1. params 传参
    传参
navigate('/about/1001')

取参

let params = useParams()
let id = params.id

懒加载路由

详细用法参考下面抽离路由配置文件以及编写路由渲染函数

import { lazy ,Suspense} from "react";

// 示例
    Component: lazy(() => import("@/pages/User")),
// 示例
		<Route
          key={path}
          path={path}
          element={
            <Suspense fallback={<div>加载中</div>}>
              <Component />
            </Suspense>
          }
        />

抽离路由配置文件

// 路由配置列表
export const routeList = [
  {
    labe: "首页",
    path: "/",
    Component: lazy(() => import("@/pages/Home")),
    roles: [USER_ROLES.ADMIN, USER_ROLES.TEST],
    redirect: "/home/recommend",
    children: [
      {
        labe: "推荐",
        path: "home/recommend",
        Component: lazy(() => import("@/pages/Home/components/Recommend")),
        roles: [USER_ROLES.ADMIN],
      },
      {
        labe: "新番",
        path: "home/new-animate",
        Component: lazy(() => import("@/pages/Home/components/NewAnimate")),
      },
      {
        labe: "日漫",
        path: "home/japan-animate",
        Component: lazy(() => import("@/pages/Home/components/JapenAnimate")),
      },
      {
        labe: "国漫",
        path: "home/chinese-animate",
        Component: lazy(() => import("@/pages/Home/components/ChineseAnimate")),
      },
    ],
  },
  {
    labe: "排行",
    path: "/rank",
    Component: lazy(() => import("@/pages/About")),
    children: [],
  },
  {
    labe: "我的",
    path: "/user",
    Component: lazy(() => import("@/pages/User")),
    children: [],
  },
  {
    key: "404",
    labe: "404页面",
    path: "*",
    Component: lazy(() => import("@/pages/PageNotFound")),
    children: [],
  },
];

编写渲染路由函数

// 渲染路由配置的方法
export const renderRoutes = (routes) => {
  if (routes && routes?.length > 0) {
    return routes?.map(({ path, Component, redirect, children }) => {
      return children && children?.length > 0 ? (
        <Route
          key={path}
          path={path}
          element={
            <Suspense fallback={<div>加载中...</div>}>
              <Component />
            </Suspense>
          }
        >
          {/* 递归渲染子路由 */}
          {renderRoutes(children)}
          {/* 重定向以及重定向的兜底 */}
          {redirect ? (
            <>
              <Route path={path} element={<Navigate to={redirect} />}></Route>
              <Route
                path={children[0].path.split("/")[0]}
                element={<Navigate to={redirect} />}
              />
            </>
          ) : (
            <>
              <Route
                path={path}
                element={<Navigate to={children[0].path} />}
              ></Route>
              <Route
                path={children[0].path.split("/")[0]}
                element={<Navigate to={children[0].path.split("/")[1]} />}
              />
            </>
          )}
        </Route>
      ) : (
        <Route
          key={path}
          path={path}
          element={
            <Suspense fallback={<div>加载中</div>}>
              <Component />
            </Suspense>
          }
        />
      );
    });
  }
};

整合Link使用

有空了再写。。。。

更多好文章传送门:https://www.cnblogs.com/operate/p/16082907.html
https://www.jianshu.com/p/e50011ce67cc

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
React Router是一个用于建立SPA应用程序的库,它提供了一种将应用程序状态与URL同步的方式。React Router v6React Router的最新版本,它引入了一些新的概念和语法。 下面是使用React Router v6搭建路由的步骤: 1. 安装React Router v6 使用npm或者yarn安装React Router v6: ``` npm install react-router-dom@next ``` 2. 创建路由 在应用程序的入口文件中,使用BrowserRouter创建一个路由: ```jsx import { BrowserRouter } from 'react-router-dom'; ReactDOM.render( <BrowserRouter> <App /> </BrowserRouter>, document.getElementById('root') ); ``` 3. 定义路由 使用Route组件定义路由。Route组件的path属性指定URL的路径,component属性指定该路径对应的组件: ```jsx import { Route } from 'react-router-dom'; function App() { return ( <div> <Route path="/" component={Home} /> <Route path="/about" component={About} /> </div> ); } ``` 在上面的例子中,当URL路径为“/”时,渲染Home组件;当URL路径为“/about”时,渲染About组件。 4. 处理404页面 使用Route组件的exact属性确保路由匹配完全相等的路径。这样可以避免在匹配“/”路径时同时匹配到所有其他路径。 使用Route组件的path属性指定“*”路径,即匹配所有路径的路径。将这个Route组件放在所有其他Route组件的下面,就可以为未匹配到任何路径的URL显示404页面: ```jsx import { Route, Routes } from 'react-router-dom'; function App() { return ( <div> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="*" element={<NotFound />} /> </Routes> </div> ); } ``` 在上面的例子中,当URL路径为任何未匹配到的路径时,渲染NotFound组件。 5. 嵌套路由 使用Routes组件嵌套Route组件,可以创建嵌套路由。在嵌套路由中,父级Route组件的path属性包所有子级Route组件的path属性的前缀。 ```jsx import { Route, Routes } from 'react-router-dom'; function App() { return ( <div> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />}> <Route path="team" element={<Team />} /> <Route path="history" element={<History />} /> </Route> <Route path="*" element={<NotFound />} /> </Routes> </div> ); } ``` 在上面的例子中,当URL路径为“/about/team”时,渲染Team组件;当URL路径为“/about/history”时,渲染History组件。 React Router v6引入了一些新的语法,例如使用Routes组件代替Router组件,使用element属性代替component属性等。这些语法的目的是让React Router更加简洁易用。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

godlike-icy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值