侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

为你的 React 应用创建路由

前端  /  管理员 发布于 6年前   218

常规路由

通常,当用户在浏览器中键入 URL 时,会向服务器发送 HTTP 请求,然后服务器检索 html 页面。对于每个新URL,用户会被重定向到新的 html 页面。你可以通过参考下图来更好地理解路由的工作原理。


为什么需要 react 路由?

将单页应用限制为单一视图并不适用于 Facebook、Instagram 等流行的社交媒体网站,这些网站现在使用 react 呈现多个视图。我们需要继续前进,学习如何在单页面应用中显示多个视图。

例如我们习惯看到显示欢迎消息和相关内容的主页。网站介绍的详细信息可以在“关于我们”页面上找到,用户列表及其详细信息会出现在不同的页面上,可能还有其他各种页面包含很多不同的视图。

那么你认为这是怎样实现的呢? 在程序中添加路由器可以解决这一需求。


React 中的路由

这将把我们带到本文的主题:React Router v4。 2017年3月13日,Micheal Jackson 和 Ryan Florence 发布了React Router v4 及可靠的文档。

他们相信“Learn Once, Route Anywhere”的理念。

在 React Conf 2017 的演讲中,他们通过展示如何将路由概念无缝地从 Web 平台投射到 Native 平台,以及将 React Router 集成到 VR 并在 React Native 中创建动画来解释这一点。虽然他们的谈话中的着眼点是围绕路由器 API 是如何“All About Components”的。

在React中,只涉及单个 “Html” 文件。每当用户输入新的 URL 请求时,路由不会从服务器获取数据,而是为每个新的 URL 请求交换不同的 Component。用户看上去是在多个页面之间进行切换,但实际上,根据我们的需要实现了多个视图,每个单独的组件被重新渲染。

React 是如何实现这一目标的?

这就是'History'的概念出现在图片中的地方。在 React 中,路由查看每个组件的历史记录,当历史记录发生任何变化时,组件会重新渲染。在 Router v4 之前,我们必须手动设置 History 的值。但是,从Router v4开始,<BrowserRouter>绕过了基本路径,为我们减少了大量的工作。如果你仍然需要访问历史记录,HTML5 提供了一个内置的 API,允许我们通过 pushState 和 replaceState 方法修改 History 对象。

实际上,React Router 4 完全重写了之前的版本。创建自己的路由只是你已经精通的 React Components 后的自然扩展。虽然学习它需要花费一些时间,但是一旦你继续前进,Router v4 将变得更有意义。


React Router v4 的优点

本质上我们是想在 React 的 render 方法中调用 Router Component。这是因为整个 Router API 都是关于组件的。当然,每个 Component 的角色都是像所有 React 应用一样呈现UI。


1. 无需手动设置历史记录

我们只需将自己的 Router App Component 包装在 <BrowserRouter> 中。

ReactDOM.render((  <BrowserRouter>      <App/>  </BrowserRouter>), document.getElementById(“root”));

现在让我们通过一个例子来理解路由:

我们将创建三个页面。这是页面列表及其对应的地址。

PageAddressHome‘/’About‘/about’Topic‘/topic’


2. 包拆分:

react-router 库现在被分为三个独立的包。

react-router-dom:专为 Web 应用而设计。react-router-native:专为移动应用而设计。react-router-core:可以用于核心应用的任何地方。

我们需要安装依赖项:

$ npm install --save react-router-dom

(如果你没有安装最新的npm(5.x)版本,请使用 save 命令。)

从 react-router-dom 库中导入 BrowserRouter 以及 Link 和 Route。

可以将 BrowserRouter 可视化为呈现子路径的根组件。

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

接下来让我们了解 Link 和 Route 组件,然后再继续了解 Router v4 的优势。

Link

Link 用于在程序中的内部路由之间导航。它相当于锚标签:<a> </a>。

Link 传递一个字符串参数 to,其中指定了 URL 的路径。

<ul>  <li><Link to="/">Home</Link></li>  <li><Link to="/about">About</Link></li>  <li><Link to="/topics">Topics</Link></li></ul>
Route

现在看一下 <Route>,它可以被视为负责重新渲染 UI 的单一子组件。如果用户指定的位置与 <Route> 中定义的路径匹配,则 <Route> 可以通过两种方式定义视图:

创建 <Route> 中指定的 Component使用内联 render 函数

如果指定的URL与定义的路径不匹配,<Route> 将返回 null。 <Route> 有两个参数,一个用于路径,另一个用于渲染 UI。

<BrowserRouter>  <div>    <Route exact path="/" render={ ( ) => (<h2> HomePage </h2>) } />    <Route path="/about" component={About}/>    <Route path="/topics" component={Topics}/>  </div></BrowserRouter>

3. 用 exact 取代 IndexRoute:

无需使用 IndexRoute 呈现 HomePage,你会注意到前面代码片段中的 exact 属性。这是 React Router v4 声明 性质的一个的例子。

v4 中的路由为 inclusive 意味着可以同时呈现多个路由。我们使用 exact 属性来解决多匹配中的问题。

在前面的例子中没有使用 exact,URL '/' 将匹配路径 '/'、'/about' 和 '/topics'。但是我们希望 '/' 仅匹配我们的渲染函数,因此使用 exact 明确地实现了这一点。


4. 路由只能有一个单一子元素:

这就是我们需要在 <div> 中包装路由的原因。如果不这样做,你会得到以下异常。

Uncaught Error: A <Router> may have only one child element

5. Switch:

虽然我们可以在一个 <div> 标签中封装几个路由。如果我们希望一次只渲染一个路径组件,可以使用 <switch> 标签。它按顺序检查每个路径的匹配并在找到第一个匹配后停止。

<switch>  <route exact path=’/’   component={Home}/>  <route path=’/users/:id’ component={User }/>  <route path=’/users’   component={Roster}/><switch>

在示例中,我们将路径 /users/:id 放置在 /users 前面。这是因为 users/:id 将匹配 /users 和 /users/:id。

现在你已经对 React Router 有了基本的了解,下面是定义我们的 Router App Component 的完整代码。

const App= () => (  <BrowserRouter>    <div>    <ul>      <li><Link to="/">Home</Link></li>      <li><Link to="/about">About</Link></li>      <li><Link to="/topics">Topics</Link></li>    </ul>    <Route exact path="/" render={ ( ) => (<h2> HomePage </h2>) } />    <Route path="/about" component={About}/>    <Route path="/topics" component={Topics}/>    </div>  </BrowserRouter>)


  • 上一条:
    vue.js阻止事件冒泡和默认事件
    下一条:
    React Router 5 发布,更好地支持 React 16
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客