react實現路由跳轉_react實現hash路由

眾所周知,目前單頁面使用的路由有兩種實現方式:

  • hash 模式
  • history 模式

hash 模式

路由原理:

我們先來看hash模式,頁面首次加載時需要在load事件中解析初始的URL,從而展示進入的頁面。當 # 后面的哈希值發生變化時,不會向服務器請求數據,可以通過 hashchange 事件來監聽到 URL 的變化,從而進行跳轉頁面。

0a706913fdee5bdc4b99a313b3e8d5e8.png

react代碼實現:

1、使用react腳手架構建一個react的項目:

>npx creact-react-app my-app

2、創建兩個組件 home.js 、 setting.js,使用hash路由來實現兩個組件的切換。

項目目錄如下:

aa068ca321eb51884308bf93c7499d7b.png

3、在App.js文件中,我們需要實現如下的效果:

import React from 'react'import Home from './pages/home'import Setting from './pages/setting'import {Router, Route, Link} from './router'export default function App() {  return (    首頁      設置      )}

整個結構使用Router組件包裹,由Route組件承載每一項路由的組件,由Link標簽實現切換。那么我們來看一下router內部如何實現的。

4、先來看一下router文件夾的結構:

e6f2655c84c5fec229706a551343fd08.png

組件Router,Route,Link在router/Route.js,router/Route.js,route/Link.js三個文件中實現。router/index.js將三個組件集成方便外部調用。來看一下index.js的內容:

export {default as Router} from './Router'export {default as Route} from './Route'export {default as Link} from './Link'

5、整個路由項目被Router標簽包裹,實際上需要達到共享路由當前地址的目的,借助react中的 context 來實現。同時Router組件需要在項目首次加載時解析當前的hash值,并且監聽hash值的變化,根據hash值,來通知 children 當前的路由地址。代碼如下:

import React, { Component, createContext } from "react";// 用于共享路由當前hash地址export const RouterContext = createContext();export default class Router extends Component {  state = {    path: "/",//路由當前hash地址  };  // 解析hash地址  getPath() {    let path = window.location.hash;    if (path) {      path = path.replace("#", "");    } else {      path = "/";    }    this.setState({ path });  }  componentDidMount() {    // 先解析第一次的hash值    this.getPath();    // 監聽之后hash值的變化,進入路由和返回    window.onhashchange = (ev) => {      this.getPath();    };  }  render() {    // 使用context共享路由當前hash地址    return (              {this.props.children}          );  }}

6、Route組件是根據當前的hash地址判斷當前的Route承載的組件是否應該顯示,代碼如下:

import React, {useContext} from 'react'import {RouterContext} from './Router'export default function Route(props) {  //獲得當前hash地址  const context = useContext(RouterContext);  return (    //當前的hash地址和組件配置的地址比較,相等就進入路由對應的組件,不想等則不顯示組件。    context.path === props.path ?  : null  );}

注:如果需要實現路由嵌套和動態路由,當前的hash地址和組件配置的地址比較就不是使用===判斷這么簡單了,在這里我不做陳述,感興趣的話可以自己研究一下。

7、Link組件只需要觸發hash路由的切換。代碼如下:

import React from 'react'export default function Link({to, children}) {  //Link組件實現hash路由的切換,故只需要通過a標簽切換hash值  return (          {children}      )}

8、最后,我們來看一下顯示效果:

e2355953c25ff2a5311debd2f30b56ca.png

history 模式的實現,詳見下回分解~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372327.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372327.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java中的Google協議緩沖區

總覽 協議緩沖區是一種用于結構化數據的開源編碼機制。 它是由Google開發的,旨在實現語言/平臺中立且可擴展。 在本文中,我的目的是介紹Java平臺上下文中協議緩沖區的基本用法。 Protobuff比XML更快,更簡單,并且比JSON更緊湊。 當…

匈牙利哦模板 二分匹配 完全匹配問題

匈牙利算法的核心思想就是 騰空間, 有條件 創造,沒條件也要創造! bool find(int x){int i,j;for (j1;j<m;j){ //掃描每個被匹配的人 if (line[x][j]true && used[j]false) //如果有關系并且還沒有標記過(這里標記的意思是這次查找曾試圖改變過的歸屬問題&a…

ThinkPHP 中驗證碼的看不清切換

<!--HTML頁面--> <!DOCTYPE html><html><head> <title></title></head><body><script type"text/javascript" src"__PUBLIC__/js/jquery-1.8.2.min.js"></script><form action"{:U(H…

mysql從表截取信息_mysql中循環截取用戶信息并插入到目標表對應的字段中

操作環境&#xff1a;有表game_list&#xff0c;字段&#xff1a;uid&#xff0c;score1&#xff0c;score2&#xff0c;seat_id&#xff0c;last_update&#xff1b;傳入參數為i_player_detail &#xff0c;傳入的值為多個用戶的id、之前分數、之后分數、座位號&#xff0c;每…

Java中的數組,列表,集合,映射,元組,記錄文字

有時&#xff0c;當我對JavaScript的強大功能和表現力感到興奮時&#xff0c;我發現自己錯過了Java世界中的一兩個功能。 除了lambda表達式/閉包或任何您想稱為“匿名函數”的東西之外&#xff0c;它還對數組&#xff0c;數組&#xff0c;列表&#xff0c;集合&#xff0c;映射…

mysql鎖表問題的解決方法_MYSQL鎖表問題的解決方法

本文實例講述了MYSQL鎖表問題的解決方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;很多時候&#xff01;一不小心就鎖表&#xff01;這里講解決鎖表終極方法&#xff01;案例一mysql>show processlist;參看sql語句一般少的話mysql>kill thread_id;就可以解…

linux——(1)初識linux

linux有窗口管理員環境和純文本界面環境&#xff0c;同時linux默認提供6個Terminal來讓用戶登錄。crtlaltF1-6可自由切換。其中如果窗口管理員環境處于運行狀態&#xff0c;那么可以按crtlaltF7直接切過去。 常用命令&#xff1a; cd [dir] #進入dir目錄下 ls #列出當前目錄下的…

4.26學習成果

哇&#xff0c;今天終于開始接觸Web了&#xff0c;感覺有點小興奮&#xff0c;這幾天看來那個視頻感覺挺有趣的&#xff0c;挺奇妙的。看到人家敲代碼&#xff0c;感覺好厲害。但是感覺不懂&#xff0c;所以&#xff0c;要努力學習了。 今天的學習成果&#xff1a; 網頁由什么組…

將Glassfish 3連接到外部ActiveMQ 5代理

介紹 在ONVZ&#xff0c;我們將Glassfish 3用作開發和生產應用服務器&#xff0c;我們對其性能和穩定性以及周圍的廣大社區感到非常滿意。 我很少遇到在stackoverflow或java.net上沒有匹配解決方案的問題。 作為我們開源策略的一部分&#xff0c;我們還運行了一個定制的ActiveM…

esp8266 lcd 天氣_ESP8266 顯示實時天氣信息

代碼文件getdata.h#include #include #include #include #include #include #include #define DEBUG 1#define MAX_CONTENT_SIZE 2000const char* ssid "weather";const char* password "mymymymy";WiFiClient client;HTTPClient http;char response[MAX…

【VS開發】visual studio 2015的NuGet Manager解決方案管理功能

NuGet的官方說明是&#xff1a;NuGet是一款Visual Studio的擴展&#xff0c;它可以簡單的安裝、升級開源庫和工具。 官網地址&#xff1a;http://www.nuget.org/ 官網最醒目的位置就是下載鏈接&#xff0c;安裝完成后我們來快速體驗一把。 手上有個小項目需要使用到json格式&am…

五. 面向對象高級特性4. 接口的概念和使用

在抽象類中&#xff0c;可以包含一個或多個抽象方法&#xff1b;但在接口(interface)中&#xff0c;所有的方法必須都是抽象的&#xff0c;不能有方法體&#xff0c;它比抽象類更加“抽象”。接口使用 interface 關鍵字來聲明&#xff0c;可以看做是一種特殊的抽象類&#xff0…

智能配料

我們都有多少次聽說“分批處理”會增加延遲&#xff1f; 作為對低延遲系統充滿熱情的人&#xff0c;這讓我感到驚訝。 以我的經驗&#xff0c;正確完成批處理不僅可以提高吞吐量&#xff0c;還可以減少平均延遲并保持一致。 那么&#xff0c;批處理如何神奇地減少延遲呢&#x…

mysql從myisam_將MySQL從MyISAM轉換成InnoDB錯誤和解決辦法

原來自己用的是為了裝的&#xff0c; 所以在設置database usage(如下圖1)的時候按照discuz官方的建議&#xff0c;選的都是Non-Transactional Database Only(只支持MyISAM數據引擎的非事務數據庫)&#xff0c;用MyISAM數據庫&#xff0c;還沒涉及到需要InnoDB&#xff0c;因此打…

相似性度量中用到的一些距離函數

本文目錄 1. 歐氏距離 2. 曼哈頓距離 3. 切比雪夫距離 4. 閔可夫斯基距離 5. 標準化歐氏距離 6. 馬氏距離 7. 漢明距離 8. 杰卡德距離 & 杰卡德相似系數 9. 相關系數 & 相關距離 10. 信息熵 1. 歐氏距離(Euclidean Distance) 歐氏距離是最易于理解的一種距離計算方法&a…

Spring 3.1配置文件和Tomcat配置

Spring 3.1引入了非常有用的功能&#xff0c;稱為配置文件 。 因此&#xff0c;它易于構建&#xff0c;可以在所有環境&#xff08;開發&#xff0c;測試&#xff0c;生產等&#xff09;中部署的軟件包。 通過定義系統屬性spring.profiles.active&#xff0c; Spring允許我們使…

計算1~n之間所有奇數之和_所有奇數長度子數組的和

所有奇數長度子數組的和題目&#xff1a;給你一個正整數數組 arr &#xff0c;請你計算所有可能的奇數長度子數組的和。子數組 定義為原數組中的一個連續子序列。請你返回 arr 中 所有奇數長度子數組的和 。示例 1&#xff1a;輸入&#xff1a;arr [1,4,2,5,3]輸出&#xff1a…

MYSQL AND OR的聯用

MYSQL AND OR的聯用 MYSQL中”AND”和”OR”都是條件控制符。”AND”是求交集&#xff0c;而”OR”則是求并集&#xff0c;非常多情況下&#xff0c;須要聯用它們兩個。下面是兩張表,我僅僅列出實用的字段。 Table:student_score 學生成績 sid(學生ID) cid(課程ID) score(分數)…

九度oj 題目1456:勝利大逃亡

題目描述&#xff1a;Ignatius被魔王抓走了,有一天魔王出差去了,這可是Ignatius逃亡的好機會.魔王住在一個城堡里,城堡是一個A*B*C的立方體,可以被表示成A個B*C的矩陣,剛開始Ignatius被關在(0,0,0)的位置,離開城堡的門在(A-1,B-1,C-1)的位置,現在知道魔王將在T分鐘后回到城堡,I…

JMX:一些入門說明

JMX&#xff08;Java管理擴展&#xff09;是一種J2SE技術&#xff0c;可以管理和監視Java應用程序。 基本思想是實現一組管理對象&#xff0c;并將實現注冊到平臺服務器&#xff0c;在平臺服務器上&#xff0c;可以使用一組連接器或適配器從本地或遠程調用這些實現到JVM。 一個…