精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 React-Router 創(chuàng)建單頁應用

開發(fā) 前端
在傳統(tǒng)的網頁應用架構中,客戶端只是一個展示層,通過 url 訪問服務端,服務端則根據自己的“路由表”將對應的頁面分發(fā)給客戶端。但是在這種模式下,ajax 異步加載的內容是無法通過url 記錄的。無論你在頁面上操作了多少,異步請求了多少數據,在每次重新訪問同一個 url 時,服務端返回給客戶端的內容都是一模一樣。

最近業(yè)余時間在學習 React,配合 Redux 和 React-Router 正在不緊不慢地開發(fā)一個小工具moviemaster,用于管理硬盤中的電影劇集。在單頁應用開發(fā)中,redux 并不是必須的,所以今天只講講 前端的路由系統(tǒng)以及 React-Router的簡單使用。

什么是路由

以下來自維基百科::

路由(routing)就是通過互聯的網絡把信息從源地址傳輸到目的地址的活動。路由發(fā)生在OSI網絡參考模型中的第三層即網路層。路由引導分組轉送,經過一些中間的節(jié)點后,到它們***的目的地。

這是網絡工程中的術語,對大家而言,最熟悉的應該就是家里的路由器。路由是指路由器從一個接口上收到數據包,根據數據包的目的地址進行定向并轉發(fā)到另一個接口的過程。放在 Web 上來說,url 就像是路由器中的路由表,每個 url 對應不同的頁面或者內容,就像路由表中的的 IP 對應不同的網絡一樣。

先來看一下熟悉的套路:

在傳統(tǒng)的網頁應用架構中,客戶端只是一個展示層,通過 url 訪問服務端,服務端則根據自己的“路由表”將對應的頁面分發(fā)給客戶端。但是在這種模式下,ajax 異步加載的內容是無法通過url 記錄的。無論你在頁面上操作了多少,異步請求了多少數據,在每次重新訪問同一個 url 時,服務端返回給客戶端的內容都是一模一樣。

如果前端有自己專屬的“路由表”來分發(fā)頁面上不同的狀態(tài),那不就行了?

Hash 和 pushState

據我所知,目前有兩種方式可以構建出前端的路由系統(tǒng):url 中的#和 HTML5中的 history API。其原理如下:

  • 阻止標簽的默認跳轉動作。
  • ajax或者 Fetch 請求內容。
  • 將返回的內容添加到頁面中。
  • 使用 hash 或者 pushState 修改 url。

經典的 Hash

#代表網頁中的一個位置。后面接著的字符,就是該位置的標識符。比如,

  1. https://zhanglun.github.io/index.html#body 

就代表網頁 index.html 的 body 位置。瀏覽器讀取這個 URL 后,會自動將body位置滾動至可視區(qū)域。標識符的指定有兩個方法。

1. 使用錨點

  1. <a name="body"></a> 

2. 使用id屬性

  1. <div id="body" > 

#是用來指向文檔的內容,屬于瀏覽器的行為,與服務端無關,在 HTTP請求中也不會攜帶 #及其后面的內容,對于服務端而言http://www.baidu.comhttp://www.baidu.com#action=fuckbaidu 返回給客戶端的都是前者所分發(fā)的內容,但是在瀏覽器中可以通過 Window 對象上的 location.hash 進行操作。因此,在瀏覽器中可以通過 hash 來記錄頁面的狀態(tài),構建“路由表”。當頁面狀態(tài)發(fā)生變化時,hash 相應變化,重新加載時又可以通過 url 中攜帶的 hash 直接將頁面設置到對應的狀態(tài)。

比如:

  1. http://www.example.com/ 
  2. http://www.examplt.com/#edit 
  3. http://www.examplt.com/#settings  
  1. 訪問/時,呈現主頁。
  2. 點擊頁面上的Edit按鈕,頁面呈現編輯對應的內容。通過 url 直接訪問時,檢查 hash 是否和 edit 匹配,如果匹配執(zhí)行加載編輯內容的代碼
  3. 點擊頁面上的Settings按鈕,頁面呈現設置對應的內容。通過 url 直接訪問時,檢查 hash 是否和 settings 匹配,如果匹配執(zhí)行加載編輯內容的代碼。

以下是偽代碼:

  1. function hashHandler () { 
  2.     let key = location.hash.slice(1); 
  3.     switch(key) { 
  4.       case 'edit'
  5.         renderEditPanel(); 
  6.         break; 
  7.       case 'settings'
  8.         renderSettings(); 
  9.         break; 
  10.        default
  11.         break; 
  12.     } 
  13.   } 
  14.   window.onload = () => { 
  15.     hashHandler(); 
  16.   } 
  17.   window.onhashchange = () => { 
  18.     hashHandler(); 
  19.   }  

HTML5 中的 pushState

pushState是 History API中的一個方法,其文檔可以看這里 MDN History。它的功能簡單的說就是:修改 url,添加歷史記錄。比如/blogs和settings對應的是兩個頁面,如果只是在頁面上點擊標簽切換,需要做的操作只有:發(fā)送請求修改頁面內容和調用 pushState 方法修改 url。問題來了,對于前端而言需要將其視為同一個頁面,但實際上這兩個 url 對于服務端來說是兩個不同的請求,所以這里需要服務端的配合。

我的做法是:對應的url 返回的都是同一個頁面,然后瀏覽器接受之后檢查前端定義路由系統(tǒng),執(zhí)行響應的代碼。這個方法可能會造成頁面平白添加一個短暫的延遲,不過影響不是很大。

React-Router的使用

目前來說,任何一個路由系統(tǒng)庫或者框架,雖說是寫法不一,但是都是在上述兩種方式的基礎上實現的。讓我覺得耳目一新的是:使用路由嵌套的概念來定義 view 的嵌套集合,當一個給定的 URL 被調用時,整個集合中(***的部分)都會被渲染。

  1. import React from 'react'
  2. import { render } from 'react-dom'
  3. import { Router, Route, IndexRoute, hashHistory } from 'react-router'
  4.  
  5. import App from './containers/App'
  6. import MovieContainer from './containers/Movies'
  7. import Detail from './containers/Detail'
  8.  
  9.  
  10. let rootElement = document.getElementById('app'); 
  11. render( 
  12.   <Router> 
  13.     <Route path="/" component={App}> 
  14.       <Route path="about" component={About} /> 
  15.       <Route path="inbox" component={Inbox}> 
  16.         <Route path="messages/:id" component={Message} /> 
  17.       </Route> 
  18.     </Route> 
  19.   </Router>, 
  20. rootElement);  

在入口文件中,引入 React-Router,以組件的形式在 render 中使用,上述代碼配置結果如下: 

URL 組件
/ App
/about App -> About
/inbox App -> Inbox
/inbox/messages/:id App -> Inbox -> Message

在路由中,組件對應設置的子組件可以通過 this.props.children 渲染在父組件中

  1. class App extend Component { 
  2.   constructor(props) { 
  3.     super(props) 
  4.   } 
  5.   render() { 
  6.     <div id="app"
  7.       <h1>Hello, world!</h1> 
  8.       {this.props.children} 
  9.     </div> 
  10.   } 
  11.  

當 URL 為 / 時, App 中并沒有渲染任何的組件,render 中的 this.props.children 還是 undefined。此時可以使用 IndexRoute 來設置一個默認頁面。

  1. render( 
  2.   <Router> 
  3.     <Route path="/" component={App}> 
  4.       {/* 當 url 為/時渲染 Welcome */} 
  5.       <IndexRoute component={Welcome} /> 
  6.       <Route path="about" component={About} /> 
  7.       <Route path="inbox" component={Inbox}> 
  8.         <Route path="messages/:id" component={Message} /> 
  9.       </Route> 
  10.     </Route> 
  11.   </Router>, 
  12. rootElement);  
URL 組件
/ App -> Welcome
/about App -> About
/inbox App -> Inbox
/inbox/messages/:id App -> Inbox -> Message

此時匹配的路由分別是:/posts,/posts/usres/:userid 和/posts/users/:userid/messages/:messageid,可以看出,嵌套的<Route>所匹配的 url是包裹著它的 <Route>的 path “之和”。但是問題又來了,嵌套的好處在于路由之間結構清晰直觀,但是也會導致 url 的不美觀,試想/posts/users/:userid/messages/:messageid這么長的路由也是著實讓人心累。React-Router 的配置提供了一個選擇:將 Route 的 path 設置成絕對路徑。同時可以使用<Redirect/> 將修改為絕對路徑的路由重定向到之前的設置

  1. <Route path="posts" component={Post}> 
  2.   <Route path="users/:userid" component={User}> 
  3.     <Route path="messages/:messageid" component={Message} /> 
  4.   </Route> 
  5. </Route>  
URL 組件
/posts App -> Post
/user/:userid App -> Post -> User
/messages/:messageid App -> Post -> User ->Message

基礎的配置完成之后,通過 <Link>自動或者通過browserHistory和hashHistory手動執(zhí)行路由的跳轉。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-10-31 11:26:13

ReactRedux前端應用

2022-08-15 17:34:22

react-routv6

2020-03-20 10:25:41

React-Routev6前端

2014-06-26 09:36:02

Angular評論應用

2017-03-13 16:30:50

React Route構建JavaScript

2018-08-26 22:39:08

單頁應用HATEOAS

2023-11-27 08:24:57

FormikReact

2016-11-28 09:13:29

單頁Web模板數據

2016-09-07 15:35:06

VueReact腳手架

2014-09-09 10:49:59

AngularJS單頁應用

2021-04-26 18:48:48

微應用React

2021-06-01 09:27:52

視頻動畫Remotion

2022-09-13 09:02:19

React客戶端服務端

2020-11-02 11:33:52

ReactVue應用

2014-09-19 10:54:47

用戶體驗單頁面

2019-03-13 09:00:00

Web應用SPAJavaScript

2020-03-27 09:20:00

單頁應用程序網頁設計SPAs

2022-04-14 08:00:00

Cypress測試開發(fā)

2025-04-03 00:45:00

2020-10-27 12:07:17

DevOps單頁應用程序開發(fā)
點贊
收藏

51CTO技術棧公眾號

人妻无码一区二区三区四区| 成人激情视频在线播放| 中文字幕免费在线播放| 日本成人三级电影| 自拍偷自拍亚洲精品播放| 精品日韩美女| 国产精品视频第一页| 亚洲精选91| 久久激情视频久久| 中文精品在线观看| 日韩一区二区三区色| 在线影院国内精品| 欧美激情视频免费看| 中文字幕在线观看日本| 99久久免费精品高清特色大片| 国产精品欧美亚洲777777| 国产精品美女毛片真酒店| 99久久精品网| 一区二区三区黄色| 久久精品国产亚洲av麻豆| 深夜福利一区二区三区| 欧美丝袜自拍制服另类| 1024av视频| 蜜臀av在线播放| 亚洲欧洲日韩女同| 亚洲不卡1区| 深夜福利免费在线观看| 高清在线不卡av| 91久久中文字幕| 中文字幕 自拍偷拍| 午夜宅男久久久| 欧美激情一区二区三区成人| 朝桐光av在线| 久久久久亚洲| 色吧影院999| 手机免费看av| 伊人久久大香线蕉av不卡| 精品福利一二区| 精品久久久久久无码人妻| 亚洲香蕉久久| 制服丝袜一区二区三区| 中文字幕线观看| 国产成人免费精品| 欧美在线啊v一区| av动漫免费看| 亚洲一区二区三区四区| 欧美性猛交xxxx免费看漫画| 婷婷无套内射影院| av免费不卡国产观看| 亚洲午夜精品网| 欧美这里只有精品| free性欧美16hd| 亚洲r级在线视频| 日韩精品一区在线视频| 国产精品电影| 色拍拍在线精品视频8848| 日本a级片免费观看| 综合日韩av| 色国产精品一区在线观看| 好男人www社区| 欧美三级电影网址| 欧美日韩一级片在线观看| 潘金莲激情呻吟欲求不满视频| 亚洲人成777| 日韩视频永久免费| 深田咏美中文字幕| 国产乱码精品一区二区三区四区| 国产亚洲欧洲高清一区| 婷婷激情四射网| 欧美成人tv| 26uuu国产精品视频| 青青视频在线免费观看| 激情综合网激情| 97免费高清电视剧观看| 特黄aaaaaaaaa真人毛片| 久久一区二区三区国产精品| 亚洲 国产 日韩 综合一区| av大片在线| 亚洲成av人影院| 一区二区三区入口| 精品午夜视频| 亚洲精品视频在线播放| 在线免费看av网站| 影音国产精品| 国产精品久久久久久久久久| 国内精品国产成人国产三级| 91麻豆.com| 中文字幕欧美人与畜| 678在线观看视频| 91国产精品成人| 亚洲av无一区二区三区久久| 日韩有码一区| 色吧影院999| 国产区在线观看视频| 久久精品国产一区二区| 国产精品一区免费观看| porn亚洲| 精品动漫一区二区三区| 伊人色在线观看| 日本在线中文字幕一区| 久久av红桃一区二区小说| 97人人澡人人爽人人模亚洲 | 欧美插天视频在线播放| 美日韩一二三区| 天天色图综合网| 国内精品在线观看视频| 日本另类视频| 精品国产乱码久久久久久久久| 欧美 日韩 成人| 亚洲午夜黄色| 成人h视频在线观看播放| 天天干天天色天天| 亚洲美女视频在线| 国产日韩成人内射视频| 国产精品流白浆在线观看| 日韩小视频网址| 国产三级精品三级在线观看| 国产suv精品一区二区6| 婷婷视频在线播放| 欧美一区国产| 精品一区二区三区四区| 国产无遮挡又黄又爽| 国内成人精品2018免费看| 色播亚洲婷婷| www.精品| 亚洲免费精彩视频| 国产成人亚洲欧洲在线| 丰满少妇久久久久久久| 国产日本欧美在线| 午夜精品久久久久久毛片| 亚洲社区在线观看| 中文字幕av影院| 91美女片黄在线观看91美女| 霍思燕三级露全乳照| 97一区二区国产好的精华液| 美女少妇精品视频| 国产精品自产拍| 国产色产综合色产在线视频| 国产福利视频在线播放| 亚洲调教一区| 日产精品99久久久久久| 欧美日本网站| 色成人在线视频| 亚洲av毛片基地| 国产精品日韩| 欧洲精品久久| 97精品国产99久久久久久免费| 国产亚洲精品激情久久| 欧美在线视频精品| 国产精品国产三级国产普通话蜜臀| 午夜精品在线免费观看| 日韩欧美视频在线播放| 91精品久久久久久久久久另类 | 热久久视久久精品18亚洲精品| 婷婷色在线视频| 欧美性高潮床叫视频| 西西444www无码大胆| 丝袜诱惑亚洲看片| 亚洲午夜高清视频| 日韩一区网站| 26uuu另类亚洲欧美日本老年| 水中色av综合| 欧美无乱码久久久免费午夜一区| 久久国产高清视频| 国产aⅴ精品一区二区三区色成熟| 男女日批视频在线观看| 天天操综合520| 国产精品久久久久久av| 成人影院在线观看| 精品国产乱码91久久久久久网站| 丰满少妇乱子伦精品看片| 国产偷v国产偷v亚洲高清 | 大尺度一区二区| 日本中文字幕网址| 日韩成人精品一区二区| 91视频免费进入| 性欧美又大又长又硬| 日韩在线视频网站| 手机看片国产1024| 欧美性大战久久久| 国产亚洲欧美精品久久久www| 99久久er热在这里只有精品15 | 日本在线视频一区二区三区| 国内精品久久久久伊人av| 国产一区二区三区福利| 日韩一级完整毛片| 免费污污视频在线观看| 亚洲精品乱码久久久久久久久| 欧美 变态 另类 人妖| 精品一区二区三区在线观看| 成人午夜视频在线观看免费| 成人激情开心网| 国产高清一区视频| 国产成人福利夜色影视| 97香蕉超级碰碰久久免费的优势| 在线观看的av| 日韩av在线网址| 国产丝袜在线视频| 色婷婷av一区二区三区之一色屋| 欧美精品一区二区成人| 中文字幕免费一区| 天堂久久久久久| 国产成人在线观看免费网站| 丰满少妇在线观看| 亚洲美女色禁图| 亚洲国产精品影视| 成人激情电影在线| 农村寡妇一区二区三区| 99精品国产高清一区二区麻豆| 国产精品一区二区三区毛片淫片| 亚洲第一av| 欧美激情久久久久久| 免费网站看v片在线a| 亚洲视频欧洲视频| 日本波多野结衣在线| 欧美一二三区在线| 一道本在线视频| 色噜噜狠狠成人中文综合| 日韩av一二三区| 一区二区三区精品视频| 天天天天天天天天操| 欧美国产精品劲爆| 在线观看免费小视频| 26uuu欧美| 毛茸茸多毛bbb毛多视频| 成人夜色视频网站在线观看| 能看毛片的网站| 黑人巨大精品欧美黑白配亚洲 | 粉嫩av一区二区三区在线播放 | 久久视频国产精品免费视频在线| 国产三级视频在线| 亚洲少妇激情视频| 国内在线免费高清视频| 亚洲男女性事视频| 涩涩视频在线观看免费| 精品亚洲一区二区| 日本成人一区| 亚洲人成电影在线观看天堂色| 亚洲三级黄色片| 国产丝袜一区二区三区| 日本福利片在线| 亚洲日本欧美日韩高观看| 男男电影完整版在线观看| 亚洲欧美日韩天堂一区二区| 欧美孕妇孕交xxⅹ孕妇交| 亚洲精品视频在线播放| 国产三级在线看| www欧美日韩| www久久日com| 欧美黑人又粗大| sm在线播放| 欧美整片在线观看| 欧美暴力调教| 成人黄色在线播放| 亚洲一区二区电影| 精品日产一区2区三区黄免费| 免费电影一区二区三区| 日韩欧美手机在线| 天天揉久久久久亚洲精品| 成年在线观看视频| 在线视频亚洲| 人人干人人视频| 极品少妇xxxx精品少妇| 成人啪啪18免费游戏链接| 成人免费三级在线| 亚洲熟妇一区二区三区| 国产精品拍天天在线| 手机av在线看| 亚洲二区视频在线| 波多野结衣在线电影| 欧美日韩小视频| www.成人在线观看| 精品视频中文字幕| 黄色精品在线观看| 欧美一级大片视频| 亚州欧美在线| 国产主播一区二区三区四区| 精品国产一区二区三区小蝌蚪| 99热都是精品| 久久精品123| 国产精品嫩草影院8vv8| 99视频热这里只有精品免费| 超碰人人人人人人人| 亚洲高清在线精品| 亚洲永久精品视频| 日韩第一页在线| 黄色免费在线看| 全亚洲最色的网站在线观看| 国产aⅴ精品一区二区四区| 久久艳妇乳肉豪妇荡乳av| 久久精品亚洲人成影院 | 日韩专区视频网站| 精品无人乱码一区二区三区的优势| 成人羞羞视频在线看网址| 国产婷婷一区二区三区| 久久精品国产**网站演员| aaaaaav| 成人欧美一区二区三区小说| 欧美精品一二三四区| 欧美成人艳星乳罩| 在线免费av网站| 日韩av手机在线| 一区中文字幕| a级网站在线观看| 蜜臀精品久久久久久蜜臀 | 亚洲视频 欧洲视频| 好看的av在线| 亚洲精品一区二区在线观看| 色综合久久影院| 热99精品里视频精品| 成人福利一区| 麻豆传媒网站在线观看| 美女诱惑一区二区| www.久久av| 午夜精品福利一区二区蜜股av| 国内精品久久久久久久久久| 日韩在线观看免费高清| av亚洲一区二区三区| 久久国产精品 国产精品| 红桃视频国产一区| 中文字幕无码毛片免费看| 中文字幕日韩一区| 亚洲综合精品视频| 中文字幕国内精品| 日韩在线短视频| 日本不卡一区二区三区在线观看| 国产精品久久777777毛茸茸| wwwxx日本| 亚洲一卡二卡三卡四卡无卡久久| 国产特黄一级片| 久久国产精品久久久久久久久久| 日韩免费在线电影| 伊人色综合久久天天五月婷| 青椒成人免费视频| 亚洲激情图片网| 欧美三级日韩在线| 午夜激情在线观看| 91精品久久久久久久久不口人| 99久久.com| 天天爽夜夜爽视频| 一区二区三区在线免费播放| 99视频在线观看免费| 欧美精品日韩三级| 亚洲va欧美va人人爽成人影院| 国产天堂视频在线观看| 99在线精品观看| 国产一级免费视频| 夜夜嗨av色一区二区不卡| 欧美一级在线| 丰满人妻一区二区三区53号| 国产jizzjizz一区二区| 懂色av.com| 亚洲精品在线观看www| 456成人影院在线观看| 在线观看亚洲视频啊啊啊啊| 国模少妇一区二区三区| 久久成人国产精品入口| 日韩电影网在线| 久久xxx视频| 黄色免费高清视频| 福利一区福利二区| 成年人视频在线免费看| 在线观看欧美日韩国产| 精品国产鲁一鲁****| 妞干网在线观看视频| 久久综合狠狠综合久久激情| 国产精品露脸视频| 欧美伦理91i| 亚洲ab电影| 午夜一级免费视频| 亚洲第一狼人社区| 国产黄在线播放| 91亚洲精品丁香在线观看| 99pao成人国产永久免费视频| 色婷婷在线影院| 欧美一区二区私人影院日本| 超碰在线cao| 中文字幕一区二区三区5566| 成人午夜伦理影院| 精品乱码一区内射人妻无码| 久久99精品久久久久久琪琪| 亚洲人成精品久久久| 五月天视频在线观看| 欧美午夜女人视频在线| 麻豆影视在线观看_| 精品九九九九| 激情综合网av| 伊人中文字幕在线观看| 操日韩av在线电影| 欧美日韩xxxx| 免费黄视频在线观看| 欧美视频一区在线观看| 黄色成人在线网| 中文字幕在线亚洲精品| 91麻豆福利精品推荐| 国产黄色一级大片| 国产乱人伦真实精品视频| 国产亚洲亚洲| 一区二区三区免费高清视频| 在线日韩中文字幕|