React初識整理(四)--React Router(路由)

来源:https://www.cnblogs.com/zhangzhiyong/archive/2018/12/18/10140500.html
-Advertisement-
Play Games

官網:https://reacttraining.com/react-router 後端路由:主要做路徑和方法的匹配,從而從後臺獲取相應的數據 前端路由:用於路徑和組件的匹配,從而實現組件的切換。 如:`<Route path="/about" component={About}/>` 一、Rout ...


官網:https://reacttraining.com/react-router

後端路由:主要做路徑和方法的匹配,從而從後臺獲取相應的數據

前端路由:用於路徑和組件的匹配,從而實現組件的切換。 如:`<Route path="/about" component={About}/>`

一、Router分類:

1、< BrowserRouter> 如:http://example.com/about(H5的新特性,不用寫#號,具有多樣化,使⽤了HTML5的history API來記錄你的路由歷史),如果刷新頁面就會報404

2、 < HashRouter> 如:http://example.com/#/about 相容老的瀏覽器,使⽤URL( window.location.hash )的hash部分來記錄,可以刷新。

二、環境配置:

  React Router庫包含三個包: react-router , react-router-dom ,和 react-routernative 。

  react-router 是路由的核⼼包,react-router-dom用於網站開發,eact-routernative 用於移動端應用開發。而且後兩者都集成了核心包 react-router ,所有在這裡我們導入react-router-dom就好。`npm install --save react-router-dom`

三、建立路由文件

  ①我們在src文件夾下自定義1個文件夾router,用於存放路由文件index.js。我們優先建立了3個模塊,分別為登錄login、註冊register、管理主模塊manage,然後將那3個模塊導出。之後在index.js裡面進行引入、配置。

import React, { Component } from 'react'
import { HashRouter, Route } from "react-router-dom"
import Login from '../login'  //引入login模塊
import Register from "../register"  //引入register模塊
import Manage from "../manage"  //引入manage模塊
//因為解構了Component,所有直接使用,否則就要用React.Component
//export default預設導出
export default class Router extends Component {
    render() {
        return (
        //Router裡面只能有1個子元素,所有用div將多個路由包起來
            <HashRouter>
                <div>
                //Route路由,path定義路由介面,component指向模塊 
                //exact={true}代表精確查找,如不寫,則所有請求都會執行1次path="/"這個
                    <Route path="/" exact={true} component={Login} />
                    <Route path="/login"  component={Login} />
                    <Route path="/register" component={Register} />
                    <Route path="/manage" component={Manage} />
                </div>
            </HashRouter>
        )
    }
}

這裡面的Route,是React Router⾥最重要的組件。若當前路徑匹配route的路徑,它會渲染對應的UI。理想來說, < Route> 應該有⼀個叫 path 的prop,當路徑名跟當前路徑匹配才會渲染。


  ②然後在src下的主入口文件index.js里配置引入路由:

import React from "react"
import ReactDOM from "react-dom"

import Router from "./router"
ReactDOM.render(<Router />, document.getElementById("root"));

這樣,進入localhost:3000/dist時就引入到Router路由里了。

四、實現頁面間的跳轉(看上去始終保持在1個頁面上)

  在這裡我們主要有兩種方式:

  ①通過< Link>標簽跳轉:React帶有< Link>標簽,相當於我們HTML里的< a>標簽,用於做鏈接跳轉用的。我們先在頁面最開始導入Link元素: `import {Link} from "react-router-dom"`, 然後就可以在模塊任何地方使用了。 如:`<Link to="/register">新用戶註冊</Link>` 鏈接跳轉(點擊後)到註冊的路由。這裡的to就相當於< a>標簽的href屬性,指向鏈接的路由地址。

  ②使用history屬性,那麼什麼是history屬性?

    - 每個router組件創建了⼀個history對象,⽤來記錄當前路徑( history.location ),上⼀步路徑也存 儲在堆棧中。當前路徑改變時,視圖會重新渲染,給你⼀種跳轉的感覺。

     - 當前路徑⼜是如何改變的呢? history對象有 history.push() 和 history.replace() 這些⽅法來實現。當你點擊 < Link> 組件會觸發 history.push() ,使⽤ < Redirect> 則會調⽤ history.replace() 。

     - 其他⽅法 , 例如 history.goBack() 和 history.goForward() - ⽤來根據⻚⾯的後退和前進來跳轉history堆棧。

     - 具體使用方法:hhistory主要存在於props屬性下,我們可以通過this.props.history.push()這樣來調用方法。具體示例:`this.props.history.push("/manage");`這樣我們就可以在滿足我們條件的情況下,通過這個代碼實現跳轉到manage的路由下了。沒錯,push進去的是路由地址,也就是我們要跳轉的路由地址。

五、Path和match

  1、Router的屬性path是⽤來標識路由匹配的URL部分,即指向對應component(組件)的路由入口。

  2、當Router的路由路徑和當前頁面的路徑成功匹配後,會生成1個對象,即match(存在於props中)。match對象包含了以下信息:

     - match.url .返回URL匹配部分的字元串。對於創建嵌套的 < Link> 很有⽤ - match.path .返迴路由路徑字元串

    - 就是 < Route path=""> 。將⽤來創建嵌套的 < Route>

     - match.isExact .返回布爾值,如果準確(沒有任何多餘字元)匹配則返回true。

     - match.params .返回⼀個對象包含Path-to-RegExp包從URL解析的鍵值對。

六、Switch組件

  當⼀起使⽤多個 < Route> 時,所有匹配的routes都會被渲染。這個時候用Switch就很有用了,因為它只渲染匹配上的第一個組件。如:

<Switch>
    <Route exact path="/" component={login}/>
    <Route path="/register" component={Register}/>
    <Route path="/manage" component={Manage}/>
    <Route path="/:id" render = {()=>(<p>I want this  text to show up for all routes other than '/', '/products' and '/category' </p>)}/>
</Switch>

  這裡,如果不是用Switch來包裹Route,當URL為 /register,所有匹配 /register路徑的route都會被渲染。所以,那個path為 :id 的 < Route> 會跟著 Products 組件⼀塊渲染。用Switch來包裹Route就只會渲染匹配的第一項。

七、嵌套路由

前面我們給/Login等創建了路由,那要想要/manage/students這樣的兩段路由呢?
import React, { Component } from 'react'
import Students from '../students'
import Classes from "../classes"
import Teachers from "../teachers"
import { Link, Route } from "react-router-dom"

export default class Manage extends Component {
    render() {
        let { match } = this.props;
        console.log(match)
        return (
            <div>
                <ul>
                    <li><Link to={match.url + "/students"}>學生管理</Link> </li>
                    <li><Link to={match.url + "/classes"}>班級管理</Link></li>
                    <li><Link to={match.url + "/teachers"}>老師管理</Link></li>
                </ul>
                <div>
                    <Route path={match.path + "/students"} component={Students}></Route>
                    <Route path={match.path + "/classes"} component={Classes}></Route>
                    <Route path={match.path + "/teachers"} component={Teachers}></Route>
                </div>
            </div>
        )
    }
}

這裡的路由就是用manage的1段路由 match.path(構建嵌套路由)得到的,與想要配置的2段路由拼接而成,這樣的二段路由指向students這樣的嵌套組件。 然後用Link元素,用match.url獲取目前的地址(構建嵌套鏈接)與對應的路由拼接,從而進行匹配查找。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CHAR_LENGTH(str) 返回值為字元串str 的長度,長度的單位為字元。一個多位元組字元算作一個單字元。 CONCAT(str1,str2,...) 字元串拼接, 如有任何一個參數為NULL ,則返回值為 NULL。 CONCAT_WS(separator,str1,str2,...) 字元 ...
  • 問題 如何安裝並使用Oracle SQL Developer訪問Oracle。 步驟 Oracle SQL Developer是Oracle官方出品的免費圖形化開發工具,相對SQL*Plus來說,圖形化的界面便於操作,不必記憶大量的命令,輸出結果美觀。它的基本功能包括結果的格式化輸出,編輯器自動提示 ...
  • cmd命令中輸入:adb shell dumpsys activity activities 在一連串的輸出中找到Runing activities com.android.settings是包名. .HWSettings是activitie名稱 ...
  • 本文由雲+社區發表 SQLite 在移動端開發中廣泛使用,其使用質量直接影響到產品的體驗。 常見的 SQLite 質量監控一般都是依賴上線後反饋的機制,比如耗時監控或者用戶反饋。這種方式問題是: 事後發現,負面影響已經發生。 關註的只是沒這麼差。eg. 監控閾值為 500ms ,那麼一條可優化為 2 ...
  • 前期項目一直用的是Windows azure NotificationHub+Google Cloud Message 實現消息推送, 但是GCM google已經不再推薦使用,慢慢就不再維護了, 現在Google 主推 FCM, 另一方面,google在android生態中的許可權要求越來越嚴格,不 ...
  • 步驟:0. adb root0. adb shell0. ps | grep browser1. gdbserver :5039 --attach pid2. adb forward tcp:5039 tcp:5039 1. prebuilts/gcc/linux-x86/arm/arm-eabi- ...
  • 當我們新建一個 Cocoa 項目時,Xcode 會提供一系列的模板,類似前端的腳手架工具,只需要簡單的幾個選項,就可以配置好一個項目所需的基本環境。 這些基本環境配置一般包括: 編譯選項、證書鏈選項 項目 Target、單元測試 Target 基於 git 的版本控制管理 預設的源文件 編譯選項、證 ...
  • 一、jQuery對象與JavaScript對象 ①JavaScript入口函數比jQuery入口函數執行的晚一些; JQuery的入口函數會等頁面載入完成才執行,但是不會等待圖片的載入; JavaScript入口函數需要等待頁面載入和圖片載入完成才執行; JavaScript入口函數:window. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...