React Router

1.安装

yarn add react-router-dom@5.3.0

2. react-router-dom 这个包提供了三个核心的组件

import { HashRouter, Route, Link } from 'react-router-dom'

3.使用 HashRouter 包裹整个应用,一个项目这只会有一个 Router

<HashRouter>
    <div className="App">App</div>
</HashRouter>

4.使用Link 指定导航链接

<Link to="/first">页面一</Link>
<Link to="/two">页面二</Link>

5. 使用 Router 指定路由规则

// 在哪里写的 Route,最终匹配到的组件就会渲染到哪里
<Route path='/first' component={First}></Route>

App.js

import React from 'react'
import { HashRouter, Link, Route } from 'react-router-dom'
import Home from './pages/Home'
import Search from './pages/Search'
import Comment from './pages/Comment'

export default function App() {
    return (
        <HashRouter>
            <div>
                <ul>
                    <li>
                        <Link to='/home'>首页</Link>
                    </li>
                    <li>
                        <Link to='/search'>搜索</Link>
                    </li>
                    <li>
                        <Link to='/comment'>评论</Link>
                    </li>
                </ul>
                <hr />
                <Route path='/home' component={Home} />
                <Route path='/search' component={Search} />
                <Route path='/comment' component={Comment} />
            </div>
        </HashRouter>
    )
}

Router 详细说明

  • 常有两种 Router : HashRouter 和 BrowserRouter , 用来包裹整个应用,一个 React 应用只需要使用一次
  • HashRouter : 使用 URL 的哈希值实现 (http://localhost:3000/#/first),是通过监听 window 的 hashchange 事件来实现的。
  • BrowserRouter :使用 H5 的 history API 实现  (http://localhost:3000/first),是通过监听 window 的 popstate 事件来实现的。
// 使用时建议通过 as 起一个别名,方便修改
import { HashRouter as Router, Route, Link } from 'react-router-dom'

路由的执行过程

  1. 点击Link 组件 ,浏览器地址栏中的url 发送变化
  2. ReactRouter 通过 hashchange 或 popState 监听到了地址栏 url 变化
  3. ReactRouter 内部遍历所有 Route 组件,使用路由规则(path) 与 pathname(hash) 进行匹配
  4. 当路由规则(path)能够匹配地址栏中的 pathname(hash)时,就展示 Router 对于的组件

Link 与 NavLink

  • Link 组件最终会渲染成 a 标签 ,用于指定路由导航
    • a,to 属性,将来会渲染成 a 标签的 href 属性
    • b,Link 组件无法实现导航的高亮效果
  • NavLink 组件,一个更特殊的Link 组件,可以用于指定当前导航高亮
    • a,to:用于指定地址,会渲染成 a 标签的href 属性
    • b,activeClass:用于指定高亮的类名,默认为 active
    • c,exact:精确匹配,表示必须精确匹配类名才能应用 calss,默认是模糊匹配

App.js<Link></Link> 改成了 <NavLink></NavLink> 组件,to 对应的值改成了 /,同时出口 Route 组件的 path 属性也改成了 /,代码如下。

import React from 'react'
import { HashRouter, Route, NavLink } from 'react-router-dom'
import Home from './pages/Home'
import Search from './pages/Search'
import Comment from './pages/Comment'
​
export default function App() {
    return (
        <HashRouter>
            <div>
                <ul>
                    <li>
                        <NavLink to='/'>首页</NavLink>
                    </li>
                    <li>
                        <NavLink to='/search'>搜索</NavLink>
                    </li>
                    <li>
                        <NavLink to='/comment'>评论</NavLink>
                    </li>
                </ul>
                <hr />
                <Route path='/' component={Home} />
                <Route path='/search' component={Search} />
                <Route path='/comment' component={Comment} />
            </div>
        </HashRouter>
    )
}

问题:点击搜索发现首页也应用了激活的 class 类名。

// 以 / 开头的,就会被添加 class,当访问 /search 的时候,发现是以 / 开头的,所以这里也加了 class
<NavLink to='/'>首页</NavLink>

解决方法。

// 必须是 / 才会被加 class
<NavLink exact to='/'>
    首页
</NavLink>

Route 匹配规则

{
    /* 默认是以  '/' 开头的路径就会被匹配到组件,添加 exact 属性可以开启精确匹配 */
}
;<Route path='/' exact component={Home}></Route>
  • 默认情况下,path 为 / 能够匹配所有路由组件,因为所有路由组件都是以  /   开头的,一般来说,如果路径配置了  /   往往都需要配置 exact    属性
  • 如果 path 的路径上匹配上了,那么对于的组件就会被 render,否则就会 render null
  • 如果没有指定 path 那么一定会被渲染,例如  <Route component={NotFound}></Route>

Switch 与 404

  • 通常,会把一个个的 Router 包裹在一个 Switch 组件中 ,这样只会渲染第一个匹配的组件,往往是我们期望的
  • 通过 Switch 组件配合不带 path 属性的 Router 组件 能实现 404 效果,即便不需要实现 404,也可以使用Switch 包裹来提升性能
<Switch>
    <Route exact path='/' component={Home} />
    <Route path='/about' component={About} />
    <Route path='/user' component={User} />
    <Route component={NotFound} />
</Switch>

编程式导航

  • 编程式导航:通过 JS 代码来实现页面跳转,可以处理相关逻辑,更加灵活
  • 第一种方式 通过 props 拿到 history 进行 跳转,props.history.push( ' /comment' )
  • 第二种方式 通过 react-router-dom  提供的 useHistory 钩子进行跳转
import React from 'react'
import { useHistory } from 'react-router-dom'

export default function Search(props) {
    const history = useHistory()
    const handleClick = () => {
        history.push('/comment')
    }
    return (
        <div>
            <h3>Search</h3>
            <button onClick={handleClick}>click</button>
        </div>
    )
}

动态路由传参

1.入口传参

<NavLink to='/user/111'>用户111</NavLink>
<NavLink to='/user/222'>用户222</NavLink>

2.出口匹配

<Route path='/user/:id' component={User} />

3.组件中接收

import React from 'react'
import { useParams } from 'react-router-dom'

export default function User(props) {
    const params = useParams()
    return (
        <div>
            <h2>User</h2>
            <p>props 获取参数: {props.match.params.id}</p>
            <p>useParams 获取参数: {params.id}</p>
        </div>
    )
}

<think>好的,我现在要介绍一下 React Router。首先,我需要明确用户的需求,他们可能想了解React Router的基本概念、用途以及如何在项目中使用。接下来,我应该组织内容的结构,确保信息有条理,容易理解。 首先,React Router是一个用于React应用的路由库,所以需要解释路由在单页面应用(SPA)中的作用。用户可能不太清楚SPA和传统多页面应用的区别,这里需要简单说明。然后,提到React Router的核心功能,比如管理URL和组件的映射关系,实现无刷新页面切换。 接下来,需要介绍React Router的版本。目前常用的是v6版本,所以应该重点讲解v6的API和变化。比如,从之前的Switch组件过渡到Routes组件,以及Route组件的新用法。同时,要提到常用组件如BrowserRouterLink、Navigate等,并解释它们的作用。 然后,安装方法是一个基本点,需要给出npm或yarn的安装命令,方便用户直接使用。同时,给出一个简单的代码示例,展示如何配置路由,这样用户能更直观地理解。例如,创建一个包含主页和关于页面的路由配置。 还需要注意动态路由和嵌套路由的介绍,这些是实际开发中常用的功能。动态路由可以通过参数传递,比如/users/:id,而嵌套路由则允许在父组件内渲染子组件,适用于复杂的布局结构。 另外,编程式导航也是一个重要部分,比如使用useNavigate钩子进行页面跳转,相比之前的useHistory,v6版本有所变化,需要指出这点差异,避免用户混淆。 最后,总结React Router的优势,比如保持UI与URL同步,提升用户体验,以及它在React生态系统中的地位。可能还要提到官方文档和社区资源,供用户进一步学习。 在写作过程中,要确保使用正确的中文表达,避免技术术语使用不当。同时,按照系统要求,所有行内数学表达式用$...$格式,但在这个问题中可能用不到数学公式,所以主要关注代码块和术语的正确格式。检查是否有拼写错误或语法问题,保持回答的准确性和流畅性。 可能还需要考虑用户的实际应用场景,比如他们是否在构建一个需要多个页面的React应用,或者是否需要处理认证后的重定向等问题。因此,适当提及保护路由、重定向等高级用法会更有帮助,但作为介绍,保持基础内容的完整性更重要。 总之,结构应该是:定义React Router,核心功能,安装方法,基本用法示例,主要组件介绍,动态和嵌套路由,编程式导航,总结优势,最后推荐学习资源。确保每个部分简洁明了,逐步引导用户理解React Router的使用和重要性。</think>React Router 是用于 React 应用程序的**路由管理库**,它通过管理 URL 与组件的映射关系,帮助构建单页面应用(SPA)的多页面导航体验。以下是关键要点: --- ### 一、核心功能 1. **URL 与组件映射** 将 URL 路径(如 `/about`)与 React 组件绑定,实现无刷新页面切换。 2. **动态路由** 支持参数化路径(如 `/users/:id`),通过 `useParams()` 获取参数: ```jsx const { id } = useParams(); // 获取 /users/123 中的 id=123 ``` 3. **嵌套路由** 在父组件内定义子路由,实现复杂布局: ```jsx <Route path="/dashboard" element={<Dashboard />}> <Route path="stats" element={<Stats />} /> // 匹配 /dashboard/stats </Route> ``` --- ### 二、核心组件 1. **`<BrowserRouter>`** 包裹整个应用,提供 HTML5 History API 支持: ```jsx import { BrowserRouter } from 'react-router-dom'; ReactDOM.render( <BrowserRouter> <App /> </BrowserRouter>, document.getElementById('root') ); ``` 2. **`<Routes> 与 <Route>`** - v6 版本用 `<Routes>` 替代旧版 `<Switch>` - `<Route>` 定义路径与组件的映射: ```jsx <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> </Routes> ``` 3. **`<Link>`** 替代 `<a>` 标签实现无刷新导航: ```jsx <Link to="/about">关于我们</Link> ``` 4. **`<Navigate>`** 重定向到指定路径: ```jsx <Route path="/old" element={<Navigate to="/new" />} /> ``` --- ### 三、编程式导航 通过 `useNavigate` 钩子实现 JS 控制跳转: ```jsx import { useNavigate } from 'react-router-dom'; function Login() { const navigate = useNavigate(); return ( <button onClick={() => navigate('/dashboard')}>登录后跳转</button> ); } ``` --- ### 四、安装与版本 1. **安装** 适用于 React v16.8+: ```bash npm install react-router-dom@6 ``` 2. **版本差异** - v6 简化了 API(如用 `element` 替代 `component`) - 嵌套路由配置更直观 --- ### 五、典型应用场景 1. 根据 URL 显示不同页面组件 2. 实现带参数的详情页(如 `/product/:id`) 3. 权限控制(未登录重定向到登录页) 4. 404 页面处理: ```jsx <Route path="*" element={<NotFound />} /> ``` --- ### 六、优势 - 保持 UI 与 URL 同步 - 支持浏览器前进/后退操作 - 轻量级(gzip 后仅约 6KB) 官方文档:[reactrouter.com](https://reactrouter.com/) 建议通过实际项目练习路由配置、动态参数传递和权限验证场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值