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視頻教程》
以上是React路由有幾種模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!