目录
路由背景-SPA
路由引用与使用
路由组件与属性
Link
Router
Route 组件的属性
基本用法
路由参数
IndexRoute
AppComponent.js
LoginComponent.js
HomeComponent.js
Router.js
模块化
router.js
编程式导航
路由钩子函数
onEnter
onLeave
首页 web前端 js教程 React中路由使用详解

React中路由使用详解

May 24, 2018 pm 02:20 PM
react 详解 路由

这次给大家带来React中路由使用详解,React中路由使用的注意事项有哪些,下面就是实战案例,一起来看一下。

路由

通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-router.js。  
注意:  
react-router 4.0 以上的版本和 3.0 及以下的版本有很大的差别,本教程使用的是 3.0.2 的版本,后续会更新 4.0 以上版本的教程。  
在使用 npm 安装时默认是安装最新版本,如果安装的版本是最新的,而使用上用的是 3.0 版本的用法,则会报错。  
所以在 npm 安装时要指定版本 npm install react-router@3.0.2 --save-dev

路由背景-SPA

传统的前端基本都是通过页面之间跳转来实现各功能模块的切换,这种做法会导致一个项目下来存在大量的 html 页面,而且每个页面都有一大堆的静态资源文件需要引入,在性能一直被垢病。后来有了随着 ajax 的普及,还有 jQuery 对 ajax 的封装后的便捷使用,开发者会大量的使用 ajax 来加载一个 html 页面到当前页面的某个容器当中来实现无刷新加载,但依然没有解决大量存在 html 页面和每个页面加载大量的静态资源文件而导致性能上的问题。随着移动互联网的普及,移动端对页面加载的性能要求和流量的限制越来越高,所以主流的前端框架都往 SPA 方向靠齐。
SPA,Single Page Application 的缩写,单页面应用,其目的是整个应用程序只有一个 html 页面,结合构建 webpack 的统一打包思想,把所有静态资源文件打包成一个 js 文件,在唯一的一个 html 页面引用,从而真正意义上实现一个 html 文件,一个 js 文件完成一个应用的构想。
SPA 优化了静态加载的性能,但一个应用程序还是有很多的功能模块,功能模块之间的切换,就变成了组件之间的切换,所以到目前为止基本上主流的前端框架都会有路由和组件两个概念,而且实现思想都是一致的。

路由引用与使用

//es5
var {Router, Route, hashHistory, Link, IndexRoute, browserHistory} = require("react-router");

//es6
import {Router, Route, hashHistory, Link, IndexRoute, browserHistory} from 'react-router';

//es5 和 es6 的使用都是一样的
<Link to="/">Root</Link>
<Router>
    <Route path=&#39;/&#39; component={RootComponent}/>
</Router>

//使用 `<script>` 标签 
<script src="../js/ReactRouter.js"></script>
<ReactRouter.Link to="/">Root</ReactRouter.Link>
<ReactRouter.Router>
    <ReactRouter.Route path=&#39;/&#39; component={RootComponent}/>
</ReactRouter.Router>
登录后复制

路由组件与属性

  • 用于路由之间跳转,功能等同于 a 标签。

  • 属性 to 等同于 a 标签的 href

  • <Link to="/page">page</Link>,作用等同于 <a href="#/page">page</a>

Router

  • 是最外层的路由组件,整个 Application 仅一个。

  • 属性 history 有两个属性值:

    • hashHistory 路由将通过URL的hash部分(#)切换,推荐使用。

    • <Router history={hashHistory}> 对应的 URL 形式类似 example.com/#/some/path

    • browserHistory 这种情况需要对服务器改造。否则用户直接向服务器请求某个子路由,会显示网页找不到的404错误。

    • <Router history={browserHistory}> 对应的 URL 形式类似 example.com/some/path。

Route 组件的属性

  • Route 是组件 Router 子组件,可以通过嵌套 route 来实现路由嵌套。

  • 属性 path:指定路由的匹配规则,这个属性是可以省略的,这样的话,不管路径是否匹配,总是会加载指定组件。

  • 属性 component:指当 URL 映射到路由的匹配规则时会渲染对应的组件。

  • <Route path="/" component={RootComponent}/> 当 URL 为 example.com/#/ 时会渲染组件 RootComponent

  • <Route path="/page1" component={Page1Component}/> 当 URL 为 example.com/#/page1 时会渲染组件 Page1Component

基本用法

import React from 'react'
import ReactDOM from 'react-dom'
import {Router, hashHistory, browserHistory} from 'react-router'

const html = (
    <ul>
        <li><Link to="/">Root</Link></li>
        <li><Link to="/page">page</Link></li>
    </ul>
)

class RootComponent extends React.Component{
    render(){
        return (
            <p>
                <h1>RootComponent</h1>
                {html}
            </p>
        )       
    }
}

class PageComponent extends React.Component{
    render(){
        return (
            <p>
                <h1>PageComponent</h1>
                {html}
            </p>
        )       
    }
}

ReactDOM.render(
    <Router history={hashHistory}>
        <Route path=&#39;/&#39; component={RootComponent}/>
        <Route path=&#39;/page&#39; component={PageComponent}/>
    </Router>,
    document.getElementById('app')
)
登录后复制

效果预览

路由参数

  • 路由的参数传递是通过 Route 组件的 path 属性来指定的。

  • 参数值可通过 this.props.params.paramName 来获取。

  • :paramName

    • 匹配URL的一个部分,直到遇到下一个/、?、#为止。

    • <Route path="/user/:name">

    • 匹配 URL:/#/user/sam,参数 sam 为必须存在。

    • this.props.params.name 的值为 sam。

import React from 'react'
import ReactDOM from 'react-dom'
import {Router, hashHistory, browserHistory} from 'react-router'

class UserComponent extends React.Component{
    render(){
        return (
            <p>
                <h3>UserComponent 单个参数 </h3>
                <p>路由规则:path='/user/:username'</p>
                <p>URL 映射:{this.props.location.pathname}</p>
                <p>username:{this.props.params.username}</p>
            </p>
        )       
    }
}
ReactDOM.render(
    <Router history={hashHistory}>
        <Route path=&#39;/user/:username&#39; component={UserComponent}/>
    </Router>,
    document.getElementById('app')
)
登录后复制
  • (:paramName)

    • 表示URL的这个部分是可选的。

    • <Route path="/order(/:orderid)">

    • 匹配 URL:/#/order,this.props.params.orderid 获取的值为 undefined。

    • 匹配 URL:/#/order/001,this.props.params.orderid获取参数的值为 001。

import React from 'react'
import ReactDOM from 'react-dom'
import {Router, hashHistory, browserHistory} from 'react-router'

class UserComponent extends React.Component{
    render(){
        return (
            <p>
                <h3>OrderComponent 可选参数 </h3>
                <p>路由规则:path='/order(/:orderid)'</p>
                <p>URL 映射:{this.props.location.pathname}</p>
                <p>orderid:{this.props.params.orderid}</p>
            </p>
        )       
    }
}
ReactDOM.render(
    <Router history={hashHistory}>
        <ReactRouter.Route path=&#39;/order(/:orderid)&#39; component={UserComponent}/>
    </Router>,
    document.getElementById('app')
)
登录后复制
  • *.*

    • 匹配任意字符,直到模式里面的下一个字符为止。匹配方式是非贪婪模式。

    • <Route path="/all1/*.*">

    • this.props.params 获取的参数为一个固定的对象: {splat: [*, *]}

    • 匹配 URL:/all1/001.jpg,参数为 {splat: ['001', 'jpg']}

    • 匹配 URL:/all1/001.html,参数为 {splat: ['001', 'html']}

  • *

    • 匹配任意字符,直到模式里面的下一个字符为止。匹配方式是非贪婪模式。

    • <Route path="/all2/*">

    • this.props.params 获取的参数为一个固定的对象: {splat: '*'}

    • 匹配 URL:/all2/,参数为 {splat: ''}

    • 匹配 URL:/all2/a,参数为 {splat: 'a'}

    • 匹配 URL:/all2/a/b,参数为 {splat: 'a/b'}

  • **

    • 匹配任意字符,直到下一个/、?、#为止。匹配方式是贪婪模式。

    • <Route path="/**/*.jpg">

    • this.props.params 获取的参数为一个固定的对象: {splat: [**, *]}

    • 匹配 URL:/all3/a/001.jpg,参数为 {splat: ['a', '001']}

    • 匹配 URL:/all3/a/b/001.jpg,参数为 {splat: ['a/b', '001']}

效果预览

IndexRoute

当访问一个嵌套路由时,指定默认显示的组件

AppComponent.js

import React from 'react'

export default class AppComponent extends React.Component{
    render(){
        return <p>{this.props.children}</p>
    }
}
登录后复制

LoginComponent.js

import React, {Component} from 'react'

export default class LoginComponent extends Component{
    login(){}
    render(){
        return <h1>Login</h1>
    }
}
登录后复制

HomeComponent.js

import React, {Component} from 'react'

export default class HomeComponent extends Component{
    login(){}
    render(){
        return <h1>Home</h1>
    }
}
登录后复制

Router.js

import React from 'react'
import {Route, IndexRoute} from 'react-router'

import AppComponent from '../components/app/app'
import HomeComponent from '../components/home/home'
import LoginComponent from '../components/login/login'

const routes = (
    <Route path="/" component={AppComponent}>
        <IndexRoute component={HomeComponent} />
        <Route path="login" component={LoginComponent} />
        <Route path="home" component={HomeComponent} />
    </Route>
)

export default routes;
登录后复制
  • 如果没有加IndexRoute,则在访问 http://localhost/#/ 时页面是空白的

  • 访问 http://localhost/#/login 才会显示内容

  • 加上 IndexRoute,在访问http://localhost/#/时会默认渲染HomeComponent

模块化

可利用组件Router的属性routes来实现组件模块化

router.js

import React from 'react'
import ReactDOM from 'react-dom'

import {Route, Router, IndexRoute, hashHistory} from 'react-router'

import AppComponent from '../components/app/app'
import HomeComponent from '../components/home/home'
import LoginComponent from '../components/login/login'

const routes = (
    <Route path="/" component={AppComponent}>
        <IndexRoute component={HomeComponent} />
        <Route path="login" component={LoginComponent} />
        <Route path="home" component={HomeComponent} />
    </Route>
)

ReactDOM.render(
    <Router history={hashHistory} routes={routes} />,
    document.getElementById('app')
)
登录后复制

编程式导航

  • 普通跳转 this.props.router.push('/home/cnode')

  • 带参数跳转this.props.router.push({pathname: '/home/cnode', query: {name: 'tom'}})

路由钩子函数

每个路由都有enterleave两个钩子函数,分别代表用户进入时和离开时触发。

onEnter

进入路由/home前会先触发onEnter方法,如果已登录,则直接next()正常进入目标路由,否则就先修改目标路径replace({ pathname: 'login' }),再next()跳转。

let isLogin = (nextState, replace, next) => {
    if(window.localStorage.getItem('auth') == 'admin'){
        next()
    } else {
        replace({ pathname: 'login' })
        next();
    }
    
}
const routes = (
    <Route path="/" component={AppComponent}>
        <Route path="login" component={LoginComponent} />
        <Route path="home" component={HomeComponent} onEnter={isLogin}/>
    </Route>
)
登录后复制

onLeave

对应的setRouteLeaveHook方法,如果return true则正常离开,否则则还是停留在原路由

import React from 'react'
import {Link} from 'react-router'

export default class Component1 extends React.Component{
    componentDidMount(){
        this.props.router.setRouteLeaveHook(
            this.props.route,
            this.routerWillLeave
        )
    }
    routerWillLeave(){
        return '确认要离开?'
    }
    render(){
        return (
            <p>
                <Link to="/login">Login</Ling>
            </p>
        )
    }
}
登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

PromiseA+的实现步骤详解

react实现选中li高亮步骤详解

以上是React中路由使用详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1419
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
PHP模运算符的作用及用法详解 PHP模运算符的作用及用法详解 Mar 19, 2024 pm 04:33 PM

PHP中的模运算符(%)是用来获取两个数值相除的余数的。在本文中,我们将详细讨论模运算符的作用及用法,并提供具体的代码示例来帮助读者更好地理解。1.模运算符的作用在数学中,当我们将一个整数除以另一个整数时,会得到一个商和一个余数。例如,当我们将10除以3时,商为3,余数为1。模运算符就是用来获取这个余数的。2.模运算符的用法在PHP中,使用%符号来表示模

Java框架与前端React框架的整合 Java框架与前端React框架的整合 Jun 01, 2024 pm 03:16 PM

Java框架与React框架的整合:步骤:设置后端Java框架。创建项目结构。配置构建工具。创建React应用。编写RESTAPI端点。配置通信机制。实战案例(SpringBoot+React):Java代码:定义RESTfulAPI控制器。React代码:获取并显示API返回的数据。

vue.js vs.反应:特定于项目的考虑因素 vue.js vs.反应:特定于项目的考虑因素 Apr 09, 2025 am 12:01 AM

Vue.js适合中小型项目和快速迭代,React适用于大型复杂应用。1)Vue.js易于上手,适用于团队经验不足或项目规模较小的情况。2)React的生态系统更丰富,适合有高性能需求和复杂功能需求的项目。

React在HTML中的作用:增强用户体验 React在HTML中的作用:增强用户体验 Apr 09, 2025 am 12:11 AM

React通过JSX与HTML结合,提升用户体验。1)JSX嵌入HTML,使开发更直观。2)虚拟DOM机制优化性能,减少DOM操作。3)组件化管理UI,提高可维护性。4)状态管理和事件处理增强交互性。

如何使用Golang函数处理Web请求路由 如何使用Golang函数处理Web请求路由 May 02, 2024 am 10:18 AM

在Golang中,使用函数处理Web请求路由是一种可扩展、模块化的API构建方法。它涉及以下步骤:安装HTTP路由器库。创建一个路由器。为路由定义路径模式和处理函数。编写处理函数来处理请求和返回响应。使用HTTP服务器运行路由器。这个过程允许在处理传入请求时使用模块化的方法,从而提高了可重用性、可维护性和可测试性。

React与Vue:Netflix使用哪个框架? React与Vue:Netflix使用哪个框架? Apr 14, 2025 am 12:19 AM

NetflixusesAcustomFrameworkcalled“ Gibbon” BuiltonReact,notReactorVueDirectly.1)TeamExperience:selectBasedAsedonFamiliarity.2)ProjectComplexity:vueforsimplerprojects,vueforsimplerprojects,reactforforforecomplexones.3)cocatizationNeedsneeds:reactofficatizationneedneeds:reactofferizationneedneedneedneeds:reactoffersizatization needeffersefersmoreflexiblesimore.4)ecosyaka

Go语言内存管理详解 Go语言内存管理详解 Mar 28, 2024 am 09:18 AM

Go语言内存管理详解Go语言作为一种现代化的编程语言,自带了垃圾回收器,这使得开发者无需手动管理内存,极大地简化了内存管理的复杂度。本文将详细介绍Go语言的内存管理机制,并通过具体的代码示例来说明。内存管理原理Go语言的内存管理主要依靠垃圾回收器来进行自动内存回收。垃圾回收器(GarbageCollector)会定期检查程序中不再使用的内存块,并将其回收,

黑鲨手机隐藏应用的操作方法详解 黑鲨手机隐藏应用的操作方法详解 Mar 24, 2024 pm 12:09 PM

黑鲨手机隐藏应用的操作方法详解随着手机功能的不断完善,现代人对于手机的需求也越来越多样化。有些人在手机中可能会保存一些私密的信息或者是个人照片,为了保护隐私安全,很多手机都提供了隐藏应用的功能。黑鲨手机作为一款专为游戏玩家设计的手机,也为用户提供了隐藏应用的功能。下面就来详细介绍一下黑鲨手机隐藏应用的操作方法。第一步:打开“设置”界面首先,用户需要打开黑鲨手

See all articles