React学习(二)——react中的路由

React 学习

React 路由

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

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

React 路由使用

  1. 安装依赖
npm i react-router-dom
## 或者
yarn add react-router-dom
  1. 导入路由组件
// 使用 H5 的 history API 实现(localhost:3000/first)
import {
    BrowserRouter as Router, Route, Link } from "react-router-dom";
// 使用 URL 的哈希值实现(localhost:3000/#/first)
import {
    HashRouter as Router, Route, Link } from "react-router-dom";
  • React 路由有两种模式:
    1. 使用哈希值实现(hash): HashRouter
    2. 使用 H5 中的 history API: BrowserRouter(推荐)
  1. 使用 Router 包裹应用

整个应用使用一次即可!也就是用 Router 包裹整个应用

<Router>
    <div>.....</div>
</Router>
  1. 使用 Link 组件定义导航菜单

这个组件最终会被渲染成一个 a 标签

to 属性表示:浏览器地址栏中的 pathname(location.pathname)

<Link to="/home">主页</Link>
  1. 使用 Route 组件配置路由规则和要展示的组件(路由出口)
  • Route 组件:配置路由规则以及要展示的组件
    • path 属性表示:路由规则
    • component 属性表示:该路由规则匹配时要展示的组件

Route 组件放在页面中哪个位置,那么,组件的内容就会展示在哪个地方

// 定义一个Home组件
const Home = () => <h1>这是主页</h1>
// 匹配到的路由显示对应的组件内容
<Route path="/home" component={Home}></Route>
import {
    BrowserRouter as Router, Route, Link } from "react-router-dom";

// 定义两个组件
const Home = () => <h1>这是主页</h1>;
const Login = () => <h1>这是登录页</h1>;

class Hello extends React.PureComponent {
   
    render() {
   
        return (
            <Router>
                <div>
                    <Link to="/home">主页</Link>
                    <br />
                    <Link to="/login">登录页</Link>
                    <Route path="/home" component={
   Home} />
                    <Route path="/login" component={
   Login} />
                </div>
            </Router>
        );
    }
}

路由执行过程

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

编程式导航

通过 JS 代码来实现页面跳转

  • history 是 React 路由提供的,用于获取浏览器历史记录的相关信息

  • push(path):跳转到某个页面,参数 path 表示要跳转的路径

  • go(n): 前进或后退到某个页面,参数 n 表示前进或后退页面数量(比如:-1 表示后退到上一页)

  • 组件中通过 props 来获取到路由信息

    • 对于函数组件来说就是通过 参数 props 来获取
    • 对于类组件来说,就是通过 this.props 来获取
// 改造上面的Home组件
const Home = props => {
   
    console.log(props);
    return (
        <div>
            <h1>这是主页</h1>
            <button
                onClick={
   () => {
   
                    props.history.go(-1);
                }}
            >
                返回上一页
            </button>
            <button
                onClick={
   () => {
   
                    props.history.push("/login")<
在前两篇,我们介绍了 React Router 和路由的基础知识,以及如何在应用使用路由。在本篇,我们将深入学习 React Router,并介绍一些更高级的用法。 ## 动态路由 在前面的教程,我们已经学习了如何定义静态路由。但是在实际开发,我们通常需要处理动态路由。例如,我们可能需要在 URL 传递参数,以便根据参数来渲染不同的组件。 在 React Router ,我们可以使用 `:param` 来定义动态路由参数。例如,我们可以定义一个动态路由 `/user/:id`,其 `:id` 表示一个动态参数,表示用户的 ID。当浏览器访问 `/user/123` 时,React Router 会自动将 `123` 作为参数传递给对应的组件。 下面是一个简单的例子: ```jsx import { BrowserRouter as Router, Route, Link } from "react-router-dom"; function User({ match }) { return <h1>Hello, {match.params.id}!</h1>; } function App() { return ( <Router> <div> <ul> <li> <Link to="/user/123">User 123</Link> </li> <li> <Link to="/user/456">User 456</Link> </li> </ul> <Route path="/user/:id" component={User} /> </div> </Router> ); } ``` 在上面的例子,我们定义了一个动态路由 `/user/:id`,其 `:id` 表示用户的 ID。当浏览器访问 `/user/123` 时,React Router 会自动将 `123` 作为参数传递给 `User` 组件,并显示 `Hello, 123!`。 同样,当浏览器访问 `/user/456` 时,React Router 会自动将 `456` 作为参数传递给 `User` 组件,并显示 `Hello, 456!`。 ## 嵌套路由 在实际开发,我们经常需要在一个页面嵌套多个组件。在 React Router ,我们可以使用嵌套路由来实现这个功能。 具体来说,我们可以在一个组件定义多个 `<Route>` 组件,从而实现嵌套路由。例如,我们可以定义一个嵌套路由 `/user/:id/posts`,其 `:id` 表示用户的 ID,`posts` 表示用户的帖子列表。 下面是一个简单的例子: ```jsx import { BrowserRouter as Router, Route, Link } from "react-router-dom"; function User({ match }) { return ( <div> <h1>Hello, {match.params.id}!</h1> <ul> <li> <Link to={`${match.url}/posts`}>Posts</Link> </li> </ul> <Route path={`${match.path}/posts`} component={Posts} /> </div> ); } function Posts() { return <h2>Posts</h2>; } function App() { return ( <Router> <div> <ul> <li> <Link to="/user/123">User 123</Link> </li> <li> <Link to="/user/456">User 456</Link> </li> </ul> <Route path="/user/:id" component={User} /> </div> </Router> ); } ``` 在上面的例子,我们定义了一个嵌套路由 `/user/:id/posts`,其 `:id` 表示用户的 ID,`posts` 表示用户的帖子列表。当浏览器访问 `/user/123/posts` 时,React Router 会自动将 `123` 作为参数传递给 `User` 组件,并显示 `Posts` 组件。 ## 路由守卫 在实际开发,我们通常需要实现一些路由守卫功能,例如登录验证、权限控制等。在 React Router ,我们可以使用 `Route` 组件的 `render` 属性来实现路由守卫。 具体来说,我们可以定义一个高阶组件 `AuthRoute`,用来检查用户是否登录。如果用户已登录,则渲染对应的组件;否则,跳转到登录页面。 下面是一个简单的例子: ```jsx import { BrowserRouter as Router, Route, Link, Redirect } from "react-router-dom"; function AuthRoute({ component: Component, ...rest }) { const isAuthenticated = localStorage.getItem("isAuthenticated"); return ( <Route {...rest} render={(props) => isAuthenticated ? ( <Component {...props} /> ) : ( <Redirect to={{ pathname: "/login", state: { from: props.location } }} /> ) } /> ); } function Home() { return <h1>Welcome Home!</h1>; } function Login() { const login = () => { localStorage.setItem("isAuthenticated", true); }; return ( <div> <h2>Login</h2> <button onClick={login}>Login</button> </div> ); } function App() { return ( <Router> <div> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/login">Login</Link> </li> </ul> <AuthRoute exact path="/" component={Home} /> <Route path="/login" component={Login} /> </div> </Router> ); } ``` 在上面的例子,我们定义了一个高阶组件 `AuthRoute`,用来检查用户是否登录。如果用户已登录,则渲染对应的组件;否则,跳转到登录页面。具体来说,我们首先从本地存储检查用户是否已登录,然后根据检查结果来渲染对应的组件或跳转到登录页面。 ## 总结 在本篇教程,我们深入学习React Router,并介绍了一些更高级的用法。具体来说,我们学习了如何定义动态路由、嵌套路由路由守卫。 希望通过本篇教程,你已经掌握了 React Router 的高级用法,并能够在实际开发灵活使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值