搜尋
首頁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>Root
<router>
    <route></route>
</router>

//使用 `<script>` 标签 
<script src="../js/ReactRouter.js"></script>
<reactrouter.link>Root</reactrouter.link>
<reactrouter.router>
    <reactrouter.route></reactrouter.route>
</reactrouter.router>

路由元件與屬性

  • #用於路由之間跳轉,功能等同於a 標籤。

  • 屬性 to 等同於 a 標籤的 href

  • <link to="/page">page,作用等同於<a href="#/page%20">page</a>

Router

  • 是最外層的路由元件,整個 Application 只有一個。

  • 屬性history 有兩個屬性值:

    • hashHistory 路由將透過URL的hash部分(#)切換,建議使用。

    • <router history="{hashHistory}"></router> 對應的URL 形式類似example.com/#/some/path

    • browserHistory 這種情況需要對伺服器改造。否則使用者直接向伺服器要求某個子路由,會顯示網頁找不到的404錯誤。

    • <router history="{browserHistory}"></router> 對應的 URL 形式類似 example.com/some/path。

Route 元件的屬性

  • #Route 是元件Router 子元件,可以透過嵌套route 來實現路由嵌套。

  • 屬性 path:指定路由的匹配規則,這個屬性是可以省略的,這樣的話,不管路徑是否匹配,總是會載入指定元件。

  • 屬性 component:指當 URL 對應到路由的符合規則時會渲染對應的元件。

  • <route path="/" component="{RootComponent}/"></route> 當URL 為example.com/#/ 時會渲染元件RootComponent

  • <route path="/page1" component="{Page1Component}/"></route> 當URL 為example.com/#/page1 時會渲染元件Page1Component

基本用法

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

const html = (
    
            
  • Root
  •         
  • page
  •     
) class RootComponent extends React.Component{     render(){         return (             

                

RootComponent

                {html}                      )            } } class PageComponent extends React.Component{     render(){         return (             

                

PageComponent

                {html}                      )            } } ReactDOM.render(                            ,     document.getElementById('app') )

效果預覽

路由參數

  • 路由的參數傳遞是透過Route 元件的path 屬性來指定的。

  • 參數值可透過 this.props.params.paramName 來取得。

  • :paramName

    • #符合URL的一個部分,直到遇到下一個/、?、 #為止。

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

    • 符合 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>
                </p><h3 id="UserComponent-单个参数">UserComponent 单个参数 </h3>
                <p>路由规则:path='/user/:username'</p>
                <p>URL 映射:{this.props.location.pathname}</p>
                <p>username:{this.props.params.username}</p>
            
        )       
    }
}
ReactDOM.render(
    <router>
        <route></route>
    </router>,
    document.getElementById('app')
)
  • (:paramName)

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

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

    • 匹配 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>
                </p><h3 id="OrderComponent-可选参数">OrderComponent 可选参数 </h3>
                <p>路由规则:path='/order(/:orderid)'</p>
                <p>URL 映射:{this.props.location.pathname}</p>
                <p>orderid:{this.props.params.orderid}</p>
            
        )       
    }
}
ReactDOM.render(
    <router>
        <reactrouter.route></reactrouter.route>
    </router>,
    document.getElementById('app')
)
  • *.*

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

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

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

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

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

  • *

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

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

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

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

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

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

  • **

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

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

    • 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 id="Login">Login</h1>
    }
}

HomeComponent.js

import React, {Component} from 'react'

export default class HomeComponent extends Component{
    login(){}
    render(){
        return <h1 id="Home">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>
        <indexroute></indexroute>
        <route></route>
        <route></route>
    </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>
        <indexroute></indexroute>
        <route></route>
        <route></route>
    </route>
)

ReactDOM.render(
    <router></router>,
    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>
        <route></route>
        <route></route>
    </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>Login
            </p>
        )
    }
}

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

推荐阅读:

PromiseA+的实现步骤详解

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

以上是React中路由使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript在行動中:現實世界中的示例和項目JavaScript在行動中:現實世界中的示例和項目Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

了解JavaScript引擎:實施詳細信息了解JavaScript引擎:實施詳細信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:學習曲線和易用性Python vs. JavaScript:學習曲線和易用性Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python vs. JavaScript:社區,圖書館和資源Python vs. JavaScript:社區,圖書館和資源Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C到JavaScript:所有工作方式從C/C到JavaScript:所有工作方式Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript引擎:比較實施JavaScript引擎:比較實施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境