简单学习一下 React 中的路由

97 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

1. React 路由介绍

问:为什么会产生路由?

答: 是因为现在的前端应用大多都是 SPA(单页应用程序),也就是只有一个 HTML 页面的应用程序。为了有效的使用单个页面来管理原来多个页面的功能,所以就产生了前端路由。而且因为它的用户体验更好、对服务器的压力更小,所以很受欢迎。

可以从以下几点总结一下什么是路由:

  • 前端路由的功能:让用户从一个视图(页面)导航到另一个视图(页面)
  • 前端路由是一套映射规则,在 React 中,是 URL 路径与组件的对应关系
  • 使用 React 路由简单来说,就是配置路径和组件(配对)

2. 路由的基本使用

2.1 使用步骤

  1. 安装:yarn add react-router-dom

image.png

  1. 导入路由相关组件:Router / Routes / Route / Link
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom'
  1. 使用 Router 组件包裹整个应用(重要)
<Router>
    <div className='app'>
      <h1>React 路由基础</h1>
    </div>
</Router>
  1. 使用 Link 组件作为导航菜单(路由入口)
<Link to="/first">页面一</Link>
  1. 使用 Route 组件配置路由规则和要展示的组件(路由出口)并包裹在 Routes 组件中
const First = () => <p>页面一的内容,使用路由的时候还要注意react-router-dom的版本问题,写法不一样。</p>

// 使用 Router 组件
const App = () => (
  <Router>
    <div className='app'>
      <h1>React 路由基础</h1>
      {/* 指定路由入口 */}
      <Link to="/first">点击展示页面一</Link>
      
      {/* 指定路由出口:版本不一样,这里写法不一样 */}
      {/* 版本6以下写法 */}
      {/* <Route path="/first" component={First} /> */}
      
      {/* 版本6以上写法 */}
      <Routes>
        <Route path="/first" element={<First />} />
      </Routes>
    </div>
  </Router>
)
  1. 效果演示

2.gif

2.2 常用组件说明

  • Router 组件:包裹整个应用,一个 React 应用只需要使用一次。
  • HashRouter:使用 URL 的哈希值实现(localhost:3000/#/first),会有一个 # 号,一般不推荐使用。
  • BrowserRouter:使用 H5 的 history API 实现(localhost:3000/first),推荐使用。
  • Link 组件:用于指定导航连接(a 标签)。
  • Routes 组件:用于包裹 Route 组件。
  • Route 组件:指定路由展示组件相关信息。

3. 路由的执行过程

  1. 点击 Link 组件(a标签),修改了浏览器地址栏中的 url。
  2. React 路由监听到地址栏 url 的变化。
  3. React 路由内部遍历所有 Route 组件,使用路由规则(path)与 pathname 进行匹配。
  4. 当路由规则(path)能够匹配地址栏中的 pathname 时,就展示该 Route 组件的内容。

4. 编程式导航

  • 场景:点击登录按钮,登陆成功后,通过代码跳转到后台首页,如何实现?
  • 编程式导航:通过 JS 代码来实现页面跳转
  • 使用 useNavigate 钩子函数生成 navigate 函数,可以通过 JS 代码完成路由跳转。
  • useNavigate(path):跳转到某个页面,参数 path 表示要跳转的路径。
  • useNavigate(n):前进或后退到某个页面,参数 n 表示前进或后退页面数量(比如:-1 表示后退到上一页)。
// 导入ract
import React from 'react'
import ReactDOM from 'react-dom'

// 导入路由组件
import { BrowserRouter as Router, Route, Link, Routes, useNavigate } from 'react-router-dom'

// 登录页
const Login = () => {
  const navigate = useNavigate();
  return (
    <div>
      <h1>登录页</h1>
      <button onClick={() => navigate('/home')}>点击登录</button>
    </div>
  )
}

// 首页
const Home = () => {
  const navigate = useNavigate();
  return (
    <div>
      <h1>首页</h1>
      <button onClick={() => navigate(-1)}>返回登录</button>
    </div>
  )
}

// 使用 Router 组件
const App = () => (
  <Router>
    <div className='app'>
      <h1>编程式导航</h1>
      <Link to="/login">去登录页</Link>

      <Routes>
        <Route path="/login" element={<Login />} />
        <Route path="/home" element={<Home />} />
      </Routes>
    </div>
  </Router>
)

ReactDOM.render(<App />, document.getElementById('root'))

演示效果:

1.gif

5. 默认路由

  • 问题:现在的路由都是点击导航栏菜单后展示的,如何在进入页面的时候就展示呢?
  • 默认路由:表示进入页面时就会匹配的路由
  • 默认路由 path 为:/