React路由有兩種模式,分別是:1、hash模式,該模式會在路徑前加入「#」號成為一個雜湊值;2、history模式,該模式允許操作瀏覽器的曾經在分頁或者框架裡存取的對談歷史記錄。
本教學操作環境:Windows10系統、react17.0.1版、Dell G3電腦。
一、是什麼
在單頁應用中,一個web專案只有一個html頁面,一旦頁面載入完成之後,就不用因為使用者的操作而進行頁面的重新載入或者跳轉,其特性如下:
改變 url 且不讓瀏覽器像伺服器傳送請求
在不重新整理頁面的前提下動態改變瀏覽器位址列中的URL地址
其中主要分成了兩種模式:
hash 模式:在url後面加上#,如http://127.0.0.1:5500/home/#/page1
history 模式:允許操作瀏覽器的曾經在分頁或者框架裡存取的對談歷史記錄
二、使用
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;
三、實現原理
路由描述了 URL 與 UI之間的對映關係,這種對映是單向的,即 URL 變化引起 UI 更新(無需重新整理頁面)
下面以hash模式為例子,改變hash值並不會導致瀏覽器向伺服器傳送請求,瀏覽器不發出請求,也就不會重新整理頁面
hash 值改變,觸發全域性 window 物件上的 hashchange 事件。所以 hash 模式路由就是利用 hashchange 事件監聽 URL 的變化,從而進行 DOM 操作來模擬頁面跳轉
react-router也是基於這個特性實現路由的跳轉
下面以HashRouter元件分析進行展開:
HashRouter
HashRouter包裹了整應用,
通過window.addEventListener('hashChange',callback)監聽hash值的變化,並傳遞給其巢狀的元件
然後通過context將location資料往後代元件傳遞,如下:
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進行匹配,然後決定是否執行渲染元件
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路由有幾種模式的詳細內容,更多請關注TW511.COM其它相關文章!