溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React路由模式有哪些

發(fā)布時間:2022-04-19 10:10:38 來源:億速云 閱讀:664 作者:zzz 欄目:web開發(fā)

今天小編給大家分享一下React路由模式有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

React路由有兩種模式。分別是:1、hash模式,該模式會在路徑前加入“#”號成為一個哈希值;2、history模式,該模式允許操作瀏覽器的曾經(jīng)在標簽頁或者框架里訪問的會話歷史記錄。

本教程操作環(huán)境:Windows10系統(tǒng)、react17.0.1版、Dell G3電腦。

React路由

一、是什么

在單頁應用中,一個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è)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI