浅谈react-router@4.0 使用方法和源码分析

浅谈react-router@4.0使用方法和源码分析

简介

React-Router是在React上的一个强大路由器。它可以处理导航并使页面发生渐进式加载。React-Router@4相对于上一版本有了许多改进,如无需添加任何特定的MIXIN,以及更好的文档。

使用方法

在使用React-Router之前,你必须先安装它。你可以直接在终端中输入命令来进行安装:

npm install --save react-router-dom

安装完毕后,我们就可以在React应用程序中使用React-Router了。首先,我们需要在应用程序的入口文件中引入React-Router:

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

这行代码引入了三个模块:

  1. Router:这是React-Router最重要的组件之一。这个组件是React应用程序的核心,并管理路由的状态。
  2. Route:这个组件用于匹配给定的路径,并渲染相应的组件。
  3. Link:这个组件是HTML中的超链接。但React-Router会将这个组件转化为应用程序中的导航链接。

使用React-Router的核心就是Router组件和Route组件。Route组件用来声明给定的路径将会渲染的组件,而Router组件告诉React哪些路径将使用哪个Route组件。

接下来我们在应用程序中加入BrowserRouter:

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

现在你已经准备好创建你的第一个React-Router应用程序了。让我们来看一个简单的示例:

import React from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';

const Home = () => (
  <div>
    <h2>Home</h2>
  </div>
)

const About = () => (
  <div>
    <h2>About</h2>
  </div>
)

const Topic = ({ match }) => (
  <div>
    <h3>{match.params.topicId}</h3>
  </div>
)

const Topics = ({ match }) => (
  <div>
    <h2>Topics</h2>
    <ul>
      <li>
        <Link to={`${match.url}/rendering`}>
          Rendering with React
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/components`}>
          Components
        </Link>
      </li>
      <li>
        <Link to={`${match.url}/props-v-state`}>
          Props v. State
        </Link>
      </li>
    </ul>

    <Route path={`${match.path}/:topicId`} component={Topic}/>
    <Route exact path={match.path} render={() => (
      <h3>Please select a topic.</h3>
    )}/>
  </div>
)

const BasicExample = () => (
  <Router>
    <div>
      <ul>
        <li><Link to="/">Home</Link></li>
        <li><Link to="/about">About</Link></li>
        <li><Link to="/topics">Topics</Link></li>
      </ul>

      <hr/>

      <Route exact path="/" component={Home}/>
      <Route path="/about" component={About}/>
      <Route path="/topics" component={Topics}/>
    </div>
  </Router>
)

export default BasicExample;

大多数React-Router的核心概念和API都出现在这个示例中。请注意,我们使用了Link组件来创建导航链接,使用Route组件来声明路径对应的组件。在组件中,这些参数都可以通过props来访问。

为了让这个示例运行起来,你需要将其保存为一个.jsx文件,并使用webpack进行打包。

源码分析

对路径的匹配

React-Router@4将路径匹配分为了三个部分:路径中的参数、路径的规则、路径分组。

您可以使用params来从URL中获取动态参数,例如:/users/:userId

规则使您可以声明路径的模式应该匹配哪些部分。例如,使用大括号包围的参数是参数:

/users/:userId/

他将匹配这些路径:

/users/5/
/users/0B/
/users/abcdefg/

分组是一种定义一组子路由的方法,它们由一个父路由显式地声明。例如:

<Router>
  <Route path="/" component={App}>
    <Route path="about" component={About} />
    <Route path="company" component={Company} />
    <Route path="privacy" component={Privacy} />
  </Route>
</Router>

这个示例将使用App组件,但是子路由中的内容将根据URL渲染。

Router组件

Router是React-Router中最重要的组件之一。它使用了许多React的高级概念如上下文。Router的作用是处理URL并在需要时显示正确的组件。

Route组件

Route是React-Router中的另一个重要组件。它告诉Router如何显示应用程序的不同部分。

Route有两个必需属性:path和component。path告诉Route匹配哪些路由,component告诉Route需要渲染的React组件。当某个路由与Route的path匹配时,Route会将URL中的任何参数提取并传递给渲染的组件作为props。

例如:

<Route path="/users/:userId" component={UserProfile} />

UserProfile组件可以通过props来访问适用于userID的属性。

Link组件

Link是React-Router中的一个重要组件,它用于处理用户在UI中的导航。它通过URL而不是基于JavaScript而进行导航。

<Link to="/about">About</Link>

示例一:基于路径传递参数

import React from "react";
import {
  BrowserRouter as Router,
  Route,
  Link,
  Switch
} from "react-router-dom";

const Home = () => <div>home</div>;
const About = () => <div>about</div>;
const Topic = ({ match }) => (
  <div>
    <h3>{match.params.topicId}</h3>
  </div>
);

const Topics = ({ match }) => (
  <div>
    <ul>
      <li>
        <Link to={`${match.url}/some-topic-1`}>some topic 1</Link>
      </li>
      <li>
        <Link to={`${match.url}/some-topic-2`}>some topic 2</Link>
      </li>
    </ul>

    <Route path={`${match.path}/:topicId`} component={Topic} />
  </div>
);

class App extends React.Component {
  render() {
    return (
      <Router>
        <div>
          <ul>
            <li>
              <Link to="/">home</Link>
            </li>
            <li>
              <Link to="/about">about</Link>
            </li>
            <li>
              <Link to="/topics">topics</Link>
            </li>
          </ul>

          <Switch>
            <Route exact path="/" component={Home} />
            <Route path="/about" component={About} />
            <Route path="/topics" component={Topics} />
          </Switch>
        </div>
      </Router>
    );
  }
}

export default App;

这个示例演示了如何在Route的path属性中包含参数。例如,在Topics组件中,我们有两个Route:一个匹配“/topics”路径,一个带参数的Route匹配路径为“/topics/:topicId”。我们还使用Link组件来引用这些URL,并在Topic组件中渲染了一个动态ID。

示例二:基于布尔值进行导航

import React from "react";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";

const Home = () => <div>home</div>;
const LoginPage = () => (
  <div>
    <h2>Login Page</h2>
  </div>
);

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      isLoggedIn: false
    };
  }

  render() {
    return (
      <Router>
        <div>
          <ul>
            <li>
              <Link to="/">home</Link>
            </li>
            <li>
              <Link to="/login">login</Link>
            </li>
          </ul>

          <Route exact path="/" component={Home} />
          {this.state.isLoggedIn ? (
            <div>show some protected routes</div>
          ) : (
            <Route path="/login" component={LoginPage} />
          )}
        </div>
      </Router>
    );
  }
}

export default App;

在这个示例中,我们使用了state来维护用户是否登录。如果用户已经登录,我们可以为他展示受保护的路由。否则,我们将重定向到一个login页面,它根据用户的登录状态进行渲染。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈react-router@4.0 使用方法和源码分析 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS如何操作DOM基于表格动态展示数据

    操作DOM基于表格动态展示数据是Web开发中常用的技术。JavaScript是DOM操作的主力军。下面是操作DOM基于表格动态展示数据的完整攻略: 1. 数据渲染 在JavaScript中,可以通过插值表达式、DOM操作等方式将数据渲染到HTML页面。下面我们将介绍两个渲染数据的示例。 1.1 使用innerHTML渲染表格 使用innerHTML属性,可以…

    JavaScript 2023年6月10日
    00
  • 简单聊聊Js中的常见错误类型

    简单聊聊Js中的常见错误类型 在Js编程中,我们不可避免地会遇到各种类型的错误。了解这些错误类型及其产生的原因,可以帮助我们更快速地定位错误并解决问题。下面就让我们来简单聊聊Js中的常见错误类型。 1. 引用错误(ReferenceError) 引用错误通常发生在引用未定义的变量或函数时。例如: console.log(a); // Uncaught Ref…

    JavaScript 2023年6月1日
    00
  • javascript内置对象Date案例总结分析

    下面是关于“javascript内置对象Date案例总结分析”的完整攻略。 1. 概述 JavaScript中的Date对象是表示日期和时间的构造函数,它允许你跟踪时间并执行基于时间的操作。在JavaScript中使用Date对象可以很容易地获取当前日期和时间,将日期和时间转换为特定格式,计算两个日期之间的时间间隔,查找特定日期的某个属性等。 2. 常用方法…

    JavaScript 2023年6月10日
    00
  • 深入理解JavaScript高级之词法作用域和作用域链

    深入理解JavaScript高级之词法作用域和作用域链 什么是词法作用域 词法作用域是指JavaScript代码的作用域是基于源代码中变量和函数声明的位置来确定的,而不是基于运行时的调用栈。换言之,词法作用域与代码的声明位置有关。 例如,下面的代码示例中,bar函数在foo函数内部定义,因此它的作用域(也称为“词法环境”)包含了foo函数范围内的变量,即x变…

    JavaScript 2023年5月27日
    00
  • 浅谈JavaScript中this的指向更改

    浅谈JavaScript中this的指向更改 在JavaScript中,函数的 this 关键字指向的是调用函数的对象,而不同的函数调用方式会影响 this 的指向。本文将详细讨论如何通过不同的方式来更改 this 的指向。 使用 call() 方法 call() 方法可以传递一个对象,并将其作为函数中的 this。例如: let obj = { name:…

    JavaScript 2023年6月10日
    00
  • js实现日历的简单算法

    下面是“JavaScript实现日历的简单算法”的攻略。 确定日历的显示方式 在进行日历算法之前,我们需要先确定日历的显示方式。一般来说,常用的日历显示方式有两种,一种是以星期为单位的日历(也叫“周历”),另一种是以月份为单位的日历。其中,以月份为单位的日历是比较常见的一种,因此这里我们以月份为单位的日历为例进行讲解。 确定日历的数据结构 在进行日历算法之前…

    JavaScript 2023年5月27日
    00
  • 跟我学习javascript创建对象(类)的8种方法

    跟我学习JavaScript创建对象(类)的8种方法 本文将详细讲解JavaScript中创建对象或类的8种方法,包括对象字面量、构造函数、原型链、Object.create()、工厂模式、Class语法、继承与混合等内容。 1. 对象字面量 对象字面量是一种创建对象的简单方法,通过直接在花括号内定义对象的属性和方法,以冒号作为键名和键值的分隔符。例如: l…

    JavaScript 2023年5月27日
    00
  • js程序中美元符号$是什么

    美元符号 $ 在 JavaScript 中代表一个函数或对象。在 jQuery 库中,$ 代表 jQuery 函数,因此 $ 变得非常常见。在许多网站和 Web 应用程序中,如果你想使用 jQuery 库中的函数,则必须首先使用 $ 变量。下面是一个示例代码片段: $(document).ready(function(){ $("button&qu…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部