002 React Router

159 阅读1分钟

React Router

React 路由

  • react: 18.3.1
  • react-router-dom: 6.25.1
  • vite: 5.3.4
  • typescript: 5.2.2

路由组件

<Route /> 路由目标组件 需与 <Routes /> 组合使用

  • 适用场景: 路由页面较少
<Routes>
  <Route path="/" element={<Index />} />
  <Route path="/login" element={<Login />} />
  <Route path="*" element={<Navigate to="/login" />} />
</Routes>

Navigate 组件渲染时会重定向路由

<Outlet /> 组件

使用场景:将需要大量<Route />

  • 通过与 hook 方法 useRoutes(routes) 组合使用 将返回一个 <Routes /> 组件对象 挂载到 组件中,并使用<Outlet /> 在指定位置渲染页面组件

<Link />

将会渲染一个 <a> 点击后会跳转到对应的路由

<NavLink />

将会渲染一个 <a> 点击后会跳转到对应的路由, 并且当前路由与指定路由相同时会给 <a> 加上一个默认类名 class="active"

// 重写激活类名 { isActive, isPending, isTransitioning}
<NavLink 
    to='/' 
    className={
        ({ isActive, isPending}) => isPending ? "pending" : isActive ? "is-active" : ""
    }>
    to home
</NavLink>

1. 创建 路由文件

路径 src/router/index.tsx

// import ... from '@/pages/...'
// ...
export default [{
  path: '/login',
  element: <Login />,
}, {
  path: '/',
  element: <Navigate to='/login' />,
}]

2. 引入路由

路径 main.tsx

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx' // react 根节点组件
import './index.css' //  全局样式
import { BrowserRouter } from 'react-router-dom'

const root = ReactDOM.createRoot(document.getElementById('root')!)

root.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>,
)

3. 渲染路由组件

路径 App.tsx

import routes from '@/router/index'
import { Outlet } from 'react-router-dom'

function App() {
  const route = useRoutes(routes)

  return (
    <>
      {route}
      <Outlet />
    </>
  )
}

export default App

4. 实现路由 page

在 路径 src/pages/ 创建 Login.tsxIndex.tsx,表示 登录页 和 首页