今天小編給大家分享一下React路由模式有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
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路由模式有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。