react-router基本使用

本文介绍如何使用 react-router 和 react-router-dom 进行前端路由配置,包括基本路由设置、子路由匹配及嵌套路由实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

react-router 的基本使用

react-router-dom

react-router 提供了路由核心 api。如 Router, Route, Switch 等,但没有提供有关 dom 操作进行路由跳转的 api。
react-router-dom 提供了 BrowserRouter、Route、Link 等 api,可以通过 dom 操作触发事件控制路由。
react-router-dom 中依赖了 react-router,所以安装的时候只要安装 react-router-dom。
安装

npm install react-router-dom --save

如果安装版本在 >=6, Switch -->Routes
v5 版本的文档: https://v5.reactrouter.com/web/guides/quick-start
v6 git 地址: https://github.com/remix-run/react-router

基本集成步骤

  1. 在 index.js 中
<!-- 需要有 BrowserRouter 包裹住 APP-->
import { BrowserRouter } from "react-router-dom";
root.render(
  <Provider store={store}>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </Provider>
);
  1. app.js 文件
import { Routes, Route, Outlet, Link } from "react-router-dom";
// 其中 Routes 相当于v5的 Switch ,Outlet嵌套路由,index 配置默认首页路由
<nav className={globleStyles.menu}>
  <ul>
    <li>
      <Link to="/">列表</Link>
    </li>
    <li>
      <Link to="/test">测试内容</Link>
    </li>
  </ul>
</nav>
<div className={globleStyles.layout}>
  <Routes>
    <Route index element={<List />}></Route>
    <Route path="/test" element={<Test />}></Route>
    <Route path="*" element={<NoMatch />} />
  </Routes>
</div>

以上是基本路由配置
3. 页面中匹配子路由
修改 app.js中的路由配置,新增tabs,在tabs页面中新增两个子路由tabOne,tabTwo
注:tabs路由配置path=“/tabs/*”,一定加 *,否则无法匹配到子路由

<Routes>
  <Route index element={<List />}></Route>
  <Route path="/test" element={<Test />}></Route>
  <Route path="/tabs/*" element={ <Tab />}></Route>
  <Route path="*" element={<NoMatch />} />
</Routes>

tabs 页面配置,默认展示tabOne页面

const Tab = function () {
  return (
    <div className={tabs.tab}>
      <nav>
        <ul>
          <li>
            <Link to="/tabs">tab1</Link>
          </li>
          <li>
            <Link to="tabTwo">tab2</Link>
          </li>
        </ul>
      </nav>
      <div>
        <Routes>
          <Route index element={<TabOne />}></Route>
          <Route path="/tabTwo" element={<TabTwo />}></Route>
        </Routes>
      </div>
    </div>
  )
}
// 因为 添加的是 tabs/* 所以 <Route path="/tabTwo" element={<TabTwo />}></Route> path的/不能省略

3.1 嵌套路由,见github 中example/basic/src/App.tsx

以下为完整代码
app.jsx

function App () {
  // 整体接口 左边是菜单,右边是详细的针对布局
  return (
    <div className={globleStyles.App}>
      <nav className={globleStyles.menu}>
        <ul>
          <li>
            <Link to="/">列表</Link>
          </li>
          <li>
            <Link to="/test">测试内容</Link>
          </li>
          <li>
            <Link to="/tabs">tabs</Link>
          </li>
        </ul>
      </nav>
      <div className={globleStyles.layout}>
        <Routes>
          <Route index element={<List />}></Route>
          <Route path="/test" element={<Test />}></Route>
          {/* 根据下面自己路由进行 切换 */}
          <Route path="/tabs/*" element={ <Tab />}></Route>
          <Route path="*" element={<NoMatch />} />
        </Routes>
      </div>
    </div>
  );
}

其中 Route 中 index 为默认渲染页面,tabs/*代码下面有子路由
tabs页面

import tabs from "@/style/tab.module.scss"
import OneTabChild from './tabChilds/one'
import TwoTabChild from './tabChilds/two'
import { Route, Routes, Link, Outlet } from "react-router-dom"

const Tab = function () {
  return (
    <div className={tabs.tab}>
      <nav>
        <ul>
          <li>
            <Link to="/tabs">tab1</Link>
          </li>
          <li>
            <Link to="tabTwo">tab2</Link>
          </li>
        </ul>
      </nav>
      <div>
        <Routes>
          <Route index element={<TabOne />}>
          </Route>
          {/* 嵌套路由使用方法 */}
          <Route path="/tabTwo" element={<TabTwo />}>
            <Route>
              <Route
                index
                element={<OneTabChild />}
              />
              <Route path="tabTwoChild" element={<TwoTabChild />} />
            </Route>
          </Route>
        </Routes>
      </div>
    </div>
  )
}

function TabOne () {
  return <div>这是tabOne

  </div>
}

function TabTwo () {
  return (
    <div>这是tabTwo
      <nav>
        <ul>
          <li>
            <Link to="/tabs/tabTwo">tabOneChild</Link>
          </li>
          <li>
            <Link to="tabTwoChild">tabTwoChild</Link>
          </li>
        </ul>
      </nav>
      {/* 这是渲染嵌套路由的例子 */}
      <Outlet></Outlet>
    </div>
  )
}

export default Tab
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值