精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美性久久久| 欧美aaaaa性bbbbb小妇| 国内精品久久久久影院薰衣草| 久久精品精品电影网| 三日本三级少妇三级99| 蜜桃传媒在线观看免费进入| 91丨porny丨国产入口| 国产精品露脸自拍| 久久久久久久久毛片| 你懂的在线观看一区二区| 91国偷自产一区二区三区观看| 欧美h视频在线观看| 神马久久久久久久久久| 免费看日韩精品| 久久免费福利视频| 国产日韩精品中文字无码| 999久久久精品一区二区| 欧美亚洲综合色| 男的插女的下面视频| 1区2区3区在线观看| 亚洲精品乱码| 北条麻妃一区二区三区中文字幕| 亚洲自拍偷拍精品| 国产成人免费av一区二区午夜| 欧美日韩国产综合新一区| 婷婷视频在线播放| 成人在线观看网站| 91色视频在线| 国产成人亚洲欧美| 国产又粗又黄又爽的视频| 午夜亚洲性色福利视频| 欧美黑人xxx| 亚洲精品卡一卡二| 精品理论电影| 亚洲欧美国产精品| 中文字幕一区二区三区乱码不卡| 99er精品视频| 欧美日韩国产一区二区三区地区| 妞干网在线视频观看| 97影院秋霞午夜在线观看| 国产精品美女一区二区在线观看| 欧美精品七区| 头脑特工队2免费完整版在线观看 头脑特工队2在线播放 | 老鸭窝91久久精品色噜噜导演| 九九九热精品免费视频观看网站| 亚洲 欧美 国产 另类| 国产精品三级| 亚洲欧美日韩区| 国产一级二级在线观看| 国产精品白丝av嫩草影院| 日韩午夜三级在线| 欧美性猛交乱大交| 日韩精品一区二区三区免费视频| 在线91免费看| 亚洲一区二区三区三州| 国产精品一站二站| 欧美一区二区三区的| 在线免费看v片| 国产一区二区高清在线| 制服丝袜日韩国产| www.偷拍.com| 91久久偷偷做嫩草影院电| 日韩视频在线一区二区| 亚洲少妇一区二区| 卡通动漫国产精品| 日韩精品视频在线免费观看| 素人fc2av清纯18岁| 在线日韩一区| 综合网中文字幕| 日本女人性生活视频| 亚洲国产一区二区三区在线播放 | 蜜臀久久精品久久久用户群体| 羞羞答答成人影院www| 欧美久久精品午夜青青大伊人| 午夜激情福利网| 亚洲欧美文学| 45www国产精品网站| 无码人妻熟妇av又粗又大| 日韩va亚洲va欧美va久久| 国产欧美一区二区三区视频| 99久久精品国产色欲| 成人精品视频网站| 日本视频一区二区不卡| 免费av网站在线看| 亚洲成在人线在线播放| 色诱视频在线观看| 9.1麻豆精品| 精品福利在线导航| 国产免费无遮挡吸奶头视频| 91精品啪在线观看国产81旧版| 欧美激情中文字幕在线| 国产精品久久久久久人| 激情综合色综合久久综合| 国产精品区免费视频| 国产一级片在线| 一区二区三区欧美日韩| 欧美激情国产精品日韩| 激情视频亚洲| 亚洲欧美日韩直播| 国产高潮国产高潮久久久91| 国产日韩欧美三级| 91精品综合久久久久久五月天| 日本xxxxwww| 中文字幕一区二区在线播放 | 岛国av在线播放| 欧美视频在线一区二区三区| 日本人妻一区二区三区| 狠狠色丁香婷婷综合影院| 欧美激情区在线播放| 中文字幕一区二区三区四区视频 | 欧美亚洲爱爱另类综合| 18videosex性欧美麻豆| 日本韩国欧美一区二区三区| 久久av一区二区三| 婷婷久久综合| 国产福利成人在线| 手机看片福利在线| 亚洲免费毛片网站| 性猛交ⅹ×××乱大交| 色橹橹欧美在线观看视频高清| 久热精品在线视频| 男操女视频网站| 91色.com| 国产av天堂无码一区二区三区| 青青伊人久久| 在线观看国产精品日韩av| 国产精品免费av一区二区| 国产乱码精品一区二区三区五月婷| 欧美在线一二三区| 九色porny视频在线观看| 欧美一级黄色录像| 国产午夜精品理论片| 日本在线不卡视频一二三区| 久久久久久久久久码影片| 国产亚av手机在线观看| 91精品久久久久久久久99蜜臂| jizzjizz日本少妇| 奇米一区二区三区| 四虎影院一区二区三区 | 91天堂在线观看| 色三级在线观看| 欧美三级韩国三级日本一级| 国产精品天天干| 日本中文一区二区三区| 日韩中文一区| 草莓视频成人appios| 国产亚洲一级高清| 波多野结衣黄色| 欧美激情中文不卡| 亚洲欧美在线精品| 日韩视频在线观看| 国产一区二区色| 女女色综合影院| 91精品国产免费久久综合| 成人在线观看高清| 国产91精品一区二区麻豆亚洲| 精品久久久无码人妻字幂| 麻豆一区在线| 欧美激情视频在线观看| 亚洲精品久久久蜜桃动漫 | 国产欧美一区二区精品仙草咪 | 国产精品主播直播| 欧美日韩午夜爽爽| caoporn成人免费视频在线| 欧美国产日韩一区| 图片区 小说区 区 亚洲五月| 精品国产精品三级精品av网址| 成人免费无码大片a毛片| 国产精品婷婷| 亚洲一区二区在线看| 经典三级久久| 97精品欧美一区二区三区| 三级视频在线| 欧美午夜电影网| 91插插插插插插| 99久久伊人精品| 手机看片福利日韩| 午夜国产一区二区| 国产精品久久波多野结衣| 忘忧草在线影院两性视频| 夜夜嗨av色综合久久久综合网| 国产露脸国语对白在线| 亚洲二区在线视频| 亚洲日本精品视频| 国产99一区视频免费| 久久久免费视频网站| 五月精品视频| 美女三级99| 国产激情一区| 欧美资源在线观看| 国产网友自拍视频导航网站在线观看| 日韩精品一区国产麻豆| 国产视频1区2区| 一区二区三区中文字幕在线观看| 国产肉体xxxx裸体784大胆| 麻豆视频一区二区| 免费国产黄色网址| 外国成人免费视频| 久久综合色一本| 秋霞一区二区三区| 国产精品高潮粉嫩av| 男女免费观看在线爽爽爽视频| 亚洲欧美国产高清va在线播| 亚洲av无码乱码国产麻豆| 色狠狠综合天天综合综合| 国产盗摄x88av| 亚洲国产成人午夜在线一区| 亚洲成av人片在线观看无| 久久国产福利国产秒拍| 91免费视频网站在线观看| 重囗味另类老妇506070| 色就是色欧美| 日韩极品在线| 成人免费看片网站| 亚洲精品一区二区在线播放∴| 青青草一区二区| 超清av在线| 久久成人精品一区二区三区| 国产三级在线看| 亚洲国产欧美在线成人app| 国产男男gay网站| 91久久线看在观草草青青| 久久久久久久久久综合| 自拍偷拍欧美精品| 伊人影院综合网| 国产日韩欧美精品综合| 国产乱了高清露脸对白| 成人激情文学综合网| 丰满人妻一区二区三区大胸| 捆绑紧缚一区二区三区视频| 欧美两根一起进3p做受视频| 亚洲欧美日本国产专区一区| 被灌满精子的波多野结衣| 欧美一区不卡| 亚洲精品偷拍视频| 久久精品久久久| 伊人情人网综合| 999视频精品| 一区二区免费电影| 青青草97国产精品麻豆| 日韩精品大片| 日本成人小视频| 亚洲精品国产精品久久| 欧美日一区二区| 亚洲韩国在线| 久久综合成人| 中文字幕一区二区三区有限公司| 日本一区二区三区视频| 深田咏美在线x99av| 不卡视频在线| 亚洲精品一区二区三区樱花| 日韩久久精品| 中文字幕一区二区中文字幕| 99精品在线免费在线观看| 一区二区不卡在线视频 午夜欧美不卡' | 久久精品国产亚洲av久| 国产亚洲精品福利| 国产肥白大熟妇bbbb视频| 久久精品一二三| 国产18无套直看片| 自拍av一区二区三区| 欧美视频www| 亚洲国产色一区| 日韩免费视频一区二区视频在线观看| 天天色天天操综合| 高清乱码免费看污| 欧美日高清视频| 亚洲av无码国产精品永久一区 | 天堂аⅴ在线地址8| 日韩在线观看免费av| av软件在线观看| 97人人做人人爱| 美女网站在线看| 国产精品777| 国产一区二区三区精品在线观看 | 亚洲国产日韩在线一区模特| 成人毛片18女人毛片| 欧美在线视频日韩| 国产av一区二区三区| 日韩成人av在线播放| av天在线观看| 久久免费成人精品视频| 欧美日韩亚洲国产| 91丨九色丨国产| 国产中文字幕一区二区三区 | 在线视频第一页| 夜夜嗨av一区二区三区中文字幕| av中文在线播放| 91.com在线观看| 日韩精品一二| 久久久久www| 一级毛片久久久| 91九色蝌蚪成人| 精品国产乱码久久久久久蜜坠欲下 | 九色91popny| 国产在线精品免费av| 7788色淫网站小说| 国产精品电影一区二区| 国产情侣在线视频| 在线综合视频播放| 青青草在线免费视频| 欧美男插女视频| 久久天堂av| 久久视频在线观看中文字幕| 一区二区影院| 尤蜜粉嫩av国产一区二区三区| 成人综合在线网站| 日本 欧美 国产| 色久优优欧美色久优优| 日韩在线视频免费| 另类色图亚洲色图| 成人国产一区| 欧美精品亚洲精品| 99精品热视频只有精品10| 国产精品嫩草影视| 中文字幕的久久| 天堂а√在线中文在线新版| 精品日韩欧美在线| 成人三级网址| 国产精品免费在线免费| 天堂日韩电影| 草b视频在线观看| 国产经典欧美精品| 青花影视在线观看免费高清| 欧美图区在线视频| 国产中文字幕在线| 57pao国产精品一区| 18国产精品| 成人短视频在线观看免费| 精品亚洲porn| 一区二区三区影视| 欧美日韩一卡二卡三卡| 国产有码在线| 国产精品1234| 精品美女视频| 日日噜噜噜噜久久久精品毛片| 久久综合久久综合亚洲| 久久久久久久极品| 亚洲精品国产拍免费91在线| rebdb初裸写真在线观看| 成人精品一二区| 激情欧美一区二区三区| 四虎成人免费视频| 亚洲高清免费观看高清完整版在线观看| 国产理论片在线观看| 久热精品视频在线观看一区| 精品亚洲a∨一区二区三区18| 日韩视频在线免费播放| 国产一区视频导航| 美国黄色小视频| 日韩精品中午字幕| 欧美寡妇性猛交xxx免费| 99电影网电视剧在线观看| 国产精品av久久久久久麻豆网| 95视频在线观看| 天天色 色综合| 欧美精品少妇| 国产精品色视频| 国产精品久久久久久久久久10秀| 亚洲综合伊人久久| 亚洲免费av高清| 人妻中文字幕一区| 国产成人av网址| 香蕉国产精品| 日韩精品人妻中文字幕有码| 欧美性精品220| av在线第一页| 99精彩视频| 99精品久久久| 在线观看天堂av| 日韩欧美一区中文| 国模雨婷捆绑高清在线| 欧美高清一区二区| 九色综合狠狠综合久久| 免费一级片视频| 亚洲久久久久久久久久| 伦一区二区三区中文字幕v亚洲| 特级西西444| 久久久一区二区| a级片在线播放| 日产日韩在线亚洲欧美| 久久久精品久久久久久96| 日本精品一二三区| 在线观看一区日韩| 深夜国产在线播放| 欧美理论一区二区| 国产一区二区网址| 日本午夜视频在线观看| 日韩最新av在线| 欧洲vs亚洲vs国产| 日本国产一级片| 精品成人国产在线观看男人呻吟| 亚洲视频tv| 精品国产91亚洲一区二区三区www| 日韩精品免费专区| 久久免费精彩视频| 中文字幕欧美日韩va免费视频| 豆花视频一区二区| 午夜剧场高清版免费观看| 午夜激情久久久|