您好,登錄后才能下訂單哦!
今天小編給大家分享一下React路由模式有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
React路由有兩種模式。分別是:1、hash模式,該模式會在路徑前加入“#”號成為一個哈希值;2、history模式,該模式允許操作瀏覽器的曾經(jīng)在標簽頁或者框架里訪問的會話歷史記錄。
本教程操作環(huán)境:Windows10系統(tǒng)、react17.0.1版、Dell G3電腦。
一、是什么
在單頁應用中,一個web項目只有一個html頁面,一旦頁面加載完成之后,就不用因為用戶的操作而進行頁面的重新加載或者跳轉,其特性如下:
改變 url 且不讓瀏覽器像服務器發(fā)送請求
在不刷新頁面的前提下動態(tài)改變?yōu)g覽器地址欄中的URL地址
其中主要分成了兩種模式:
hash 模式:在url后面加上#,如http://127.0.0.1:5500/home/#/page1
history 模式:允許操作瀏覽器的曾經(jīng)在標簽頁或者框架里訪問的會話歷史記錄
二、使用
React Router對應的hash模式和history模式對應的組件為:
HashRouter
BrowserRouter
這兩個組件的使用都十分的簡單,作為最頂層組件包裹其他組件,如下所示
// 1.import { BrowserRouter as Router } from "react-router-dom"; // 2.import { HashRouter as Router } from "react-router-dom"; import React from 'react'; import { BrowserRouter as Router, // HashRouter as Router Switch, Route, } from "react-router-dom"; import Home from './pages/Home'; import Login from './pages/Login'; import Backend from './pages/Backend'; import Admin from './pages/Admin'; function App() { return ( <Router> <Route path="/login" component={Login}/> <Route path="/backend" component={Backend}/> <Route path="/admin" component={Admin}/> <Route path="/" component={Home}/> </Router> ); } export default App;
三、實現(xiàn)原理
路由描述了 URL 與 UI之間的映射關系,這種映射是單向的,即 URL 變化引起 UI 更新(無需刷新頁面)
下面以hash模式為例子,改變hash值并不會導致瀏覽器向服務器發(fā)送請求,瀏覽器不發(fā)出請求,也就不會刷新頁面
hash 值改變,觸發(fā)全局 window 對象上的 hashchange 事件。所以 hash 模式路由就是利用 hashchange 事件監(jiān)聽 URL 的變化,從而進行 DOM 操作來模擬頁面跳轉
react-router也是基于這個特性實現(xiàn)路由的跳轉
下面以HashRouter組件分析進行展開:
HashRouter
HashRouter包裹了整應用,
通過window.addEventListener('hashChange',callback)監(jiān)聽hash值的變化,并傳遞給其嵌套的組件
然后通過context將location數(shù)據(jù)往后代組件傳遞,如下:
import React, { Component } from 'react'; import { Provider } from './context' // 該組件下Api提供給子組件使用 class HashRouter extends Component { constructor() { super() this.state = { location: { pathname: window.location.hash.slice(1) || '/' } } } // url路徑變化 改變location componentDidMount() { window.location.hash = window.location.hash || '/' window.addEventListener('hashchange', () => { this.setState({ location: { ...this.state.location, pathname: window.location.hash.slice(1) || '/' } }, () => console.log(this.state.location)) }) } render() { let value = { location: this.state.location } return ( <Provider value={value}> { this.props.children } </Provider> ); } } export default HashRouter;
Router
Router組件主要做的是通過BrowserRouter傳過來的當前值,通過props傳進來的path與context傳進來的pathname進行匹配,然后決定是否執(zhí)行渲染組件
import React, { Component } from 'react'; import { Consumer } from './context' const { pathToRegexp } = require("path-to-regexp"); class Route extends Component { render() { return ( <Consumer> { state => { console.log(state) let {path, component: Component} = this.props let pathname = state.location.pathname let reg = pathToRegexp(path, [], {end: false}) // 判斷當前path是否包含pathname if(pathname.match(reg)) { return <Component></Component> } return null } } </Consumer> ); } } export default Route;
以上就是“React路由模式有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。