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

用React Router 4構建通用JavaScript應用

開發 前端
React Router 是一個在 React 領域非常流行的庫。它依靠位置欄上的請求 URL 和 瀏覽器的操作歷史來渲染不同的頁面內容來保持顯示,進而將你的 app 同步到用戶接口的頁面上。

React Router 是一個在 React 領域非常流行的庫。它依靠位置欄上的請求 URL 和 瀏覽器的操作歷史來渲染不同的頁面內容來保持顯示,進而將你的 app 同步到用戶接口的頁面上。

[[185175]]

新的閃閃發亮

最近,版本4的 React Router 已經進入 beta 發布階段。損譽各半,React Router 的這一次發布是對上一版本的完整重寫,這導致了很多破壞性的 API 變更。

在版本 4 的核心理念是 “聲明式可組合性(declarative composability)”?—— 它包含 React 之所以優秀的組件概念,并將其應用于 routing。React Router 4 的每一個部分都是 React 的組件: Router ,  Route ,  Link 等等。

React Router 的一位開發者, Ryan Florence ,親手制作了一個簡短的視頻來介紹***的 React Router,這段視頻獲得了很多人的推薦:

視頻: https://youtu.be/a4kqMQorcnE

后臺如何?

新版本的 React Router 奉上了一個新的 web 頁面,上面有 許多實用的代碼示例 ,但沒有提供實例介紹如何在服務端使用 React Router 來進行基于 React 的頁面的渲染。

對于我近期正在進行的項目,對搜索引擎友好且具備***的網站運行速度是重中之重,難道這樣就要在客戶端渲染整個頁面?難道就用示例頁面上所有實例所采取的辦法?那是不可取的。我們要使用一個 Express 服務器來在后臺對 React 頁面進行渲染。

在其介紹視屏中, Ryan 有一個可以從某些 API 獲取數據來初始化其狀態的 App 組件, 使用的是 componentDidMount 生命周期方法。但異步數據的獲取操作完畢,組件就會被更新以顯示數據。

但是當要在服務端對 App 組件進行渲染的時候這樣做不會有效果: 在你使用 renderToString 的時候, 帶有 HTML 代碼的字符串在調用了組件的渲染方法之后就會被同步地創建出來。 componentDidMount 從未被調用到。

因此如果我們使用 Ryan 視頻里的示例在后臺渲染出 App 組件,它只會生成一條 “Loading…” 消息。

解決方案

作為對概念方案的驗證,我創建了一個 demo 應用,基本上就是對視頻中 Ryan 的示例進行重造,但采取的是服務器端的渲染。

應用使用了 GitHub API 去獲取有關于 Gist 代碼片段的數據:

 

代碼展示

你可以在 Github 上找到 demo 應用的源代碼:

https://github.com/technology-ebay-de/universal-react-router4

簡而言之,下面就是我所做的事情…

server/index.js

這就是每次有 HTTP 請求發到 Express 服務器的時候都會跑一次的代碼:

const routes = [
    '/',
    '/g/:gistId'
];

app.get('*', (req, res) => {
    const match = routes.reduce((acc, route) => matchPath(req.url, route, { exact: true }) || acc, null);
    if (!match) {
        res.status(404).send(render(<NoMatch />));
        return;
    }
    fetch('https://api.github.com/gists')
        .then(r => r.json())
        .then(gists => 
            res.status(200).send(render(
                (
                    <StaticRouter context={{}} location={req.url}>
                        <App gists={gists} />
                    </StaticRouter>
                ), gists
            ))
        ).catch(err => res.status(500).send(render(<Error />));
});

app.listen(3000, () => console.log('Demo app listening on port 3000'));

(注意:這里只是摘錄,你可以在  GitHub  找到完整的源代碼 )

在第 1–4行 , 我為 app 定義了一個路由數組。數組的***個元素就是針對主頁的初始請求, 沒有 Gists 被選上。第二個路由就是用來展示一個被選上的 Gist 的。

在第 6行 , 我的 Express app 被告知要處理任何可以使用星號匹配上的請求。

在第 7行 , 我使用了來自于 React Router 的  matchPath 函數對路由數組進行簡省; 結果就是一個匹配對象,其擁有關于能匹配到的路由以及任何可以從 URL 路徑轉換過來的參數,這些信息。

在第 8–11行 , 如果有不能匹配的路由,我就渲染出一個錯誤頁面,上面會說 : “頁面沒找到(Page not found)”。

這里的 render 函數只是圍繞 React 的  renderToString 的一個封裝而已,添加了包圍 React 組件的 HTML 的基礎頁面的 HTML 代碼 ( <html><head><body> , 等等)。

在第 12–22行 , 我會從 GitHub API 獲取到可以填充 App 狀態的數據,并且對 App 組件進行渲染。

最顯而易見是第 17 行,我使用了 StaticRouter 組件來初始化 React Router。該 Router 組件類型是采用服務端渲染方案的***選擇。它永遠不會改變位置, 這是我們在本場景下所需要的, 因為是在后臺上, 我們只會渲染一次,而且不會直接地對用戶的交互操作做出反應。

而第 23 行 會捕獲在處理期間產生的錯誤信息來渲染出一個錯誤頁面。

我的 App 組件看起來像下面這樣:

export default ({ gists }) => (
    <div>
        <Sidebar>
            {
                gists ? gists.map(gist => (
                    <SidebarItem key={gist.id}>
                        <Link to={`/g/${gist.id}`}>
                            {gist.description || '[no description]'}
                        </Link>
                    </SidebarItem>
                )) : (<p>Loading…</p>)
            }
        </Sidebar>
        <Main>
            <Route path="/" exact component={Home} />
            {
                gists && (
                    <Route path="/g/:gistId" render={                         ({ match }) => (
                            <Gist gist={gists.find(g => g.id === match.params.gistId)} />
                        )
                    } />
                )
            }
        </Main>
    </div>
);

(→  GitHub上有完整的源代碼 )

在第 1 行 , 組件接收到作為一個屬性的 Gist 數據對象。

第 3–13行 渲染了一個  Sidebar 組件,里面是連接到不同 Gist 鏈接。  SidebarItem 組件里面所包含的是只有在存在實際的 Gist 數據時才會被渲染的數據。在服務端,總會有這樣的情況發生。而我們在服務端和客戶端渲染中都會用到該組件。如果組件是在客戶端被渲染的, 我們可能處在獲取新的 Gist 數據這一過程之中,所以會展示出一條 “Loading…(加載中)” 的消息。

第 15行 使用了一個來自于 React Router 庫的  Route 組件,用以在路由匹配到“/”這個路徑的時候展示出  Home 組件。這里我們使用的是精確匹配, 不然的話任何以斜線開頭的路徑都會匹配到。

如果有 Gist 數據要展示的話, 那么在第 18 行 , 另外一個 Route 組件就會被用來展示一個  Gist 組件,上面是被選擇的 Gist 的詳細信息。

client/index.js

如前所述,這是一個 通用 JavaScript 應用(大家都知道的“同構”),意思是相同的代碼即可用于渲染服務器頁面,又可以用于渲染客戶端頁面。這里摘錄了一段在客戶端初始化頁面的代碼:

render((
    <BrowserRouter>
        <App gists={window.__gists__} />
    </BrowserRouter>
), document.getElementById('app'));

(→  GitHub 上的完整代碼 )

這比服務端代碼簡單多了! 第 1 行 的  render 函數就是  ReactDOM 的 render 函數 。它把我的 React 組件渲染出來的布局附加到 DOM 節點上。

第 2 行 使用了  BrowserRouter (代替了我在服務端進行渲染使用的 StaticRouter)。

第 3 行 我使用 gist 數據對 App 組件進行實例化,以此代替通過 GitHub API 獲取數據。gist 數據來自瀏覽器 DOM 的全局變量,它是后端通過 <script> 標簽放在那里的。

基本上就這些了!

當我需要在瀏覽器中打開應用程序時,我可以點擊側邊欄中的任何 Gist。客戶端的 Reactor 路由確保每次點擊鏈接時,頁面的網址都會更新,并且依賴于新網址的網頁部分會刷新。 當我點擊瀏覽器的重載按鈕時,后端的靜態路由確保顯示與之對應的數據頁面。

責任編輯:張燕妮 來源: 開源中國社區
相關推薦

2016-10-31 11:26:13

ReactRedux前端應用

2020-07-28 07:27:07

Vue前端Jquery

2016-11-01 21:02:47

javascriptreact.jsreact-route

2020-09-02 11:43:24

開發技能代碼

2016-07-01 14:43:32

DockerServerless

2024-05-15 11:42:33

FlutterWeb 庫應用程序

2022-08-15 17:34:22

react-routv6

2022-09-13 09:02:19

React客戶端服務端

2009-11-23 19:42:57

ibmdwmashup

2021-10-11 14:28:25

TypeScript企業級應用

2019-05-27 13:50:35

多云架構企業多云集成云計算

2021-11-16 14:25:38

JavaScript前端

2021-09-18 09:00:00

區塊鏈應用JavaScript

2021-07-14 17:39:46

ReactRails API前端組件

2023-09-04 08:32:43

web開發圖像

2018-10-15 10:22:51

2015-04-20 15:26:12

2024-02-26 08:04:38

ReactReact.js場景

2024-04-08 10:18:49

React前端TypeScript

2025-03-19 09:30:00

點贊
收藏

51CTO技術棧公眾號

欧美日韩美女在线| youjizz久久| 九九精品在线观看| 一卡二卡三卡四卡| 亚洲人成777| 精品福利在线视频| 一区中文字幕在线观看| 无码国产精品高潮久久99| 日本免费新一区视频 | 欧美aaa免费| 久久夜色精品国产欧美乱极品| 成人亚洲激情网| 黄色片中文字幕| 欧美91福利在线观看| 亚洲欧美综合区自拍另类| 男插女视频网站| 午夜无码国产理论在线| 亚洲18色成人| 中文字幕第一页亚洲| 美州a亚洲一视本频v色道| 国产91精品免费| 成人久久久久久| 黄色在线视频网址| 亚洲最新无码中文字幕久久| 国产精品视频一区二区三区不卡| 国产一区福利视频| 国产精品久久综合青草亚洲AV| 一本久道久久综合狠狠爱| 欧美成人久久久| 成人黄色短视频| jvid福利在线一区二区| 亚洲精品美女网站| 少妇熟女视频一区二区三区| 91成人在线网站| 欧美视频在线一区二区三区 | 长河落日免费高清观看| 在线一级成人| 日韩高清a**址| 在线看黄色的网站| av成人男女| 欧美xxxx在线观看| 美女日批在线观看| 欧美日本三级| 日韩欧美色综合网站| 在线观看岛国av| 日韩免费大片| 欧美日韩电影在线播放| 天美星空大象mv在线观看视频| 奇米777日韩| 一本在线高清不卡dvd| 久久久999免费视频| 神马久久午夜| 日韩欧亚中文在线| 无码少妇一区二区三区芒果| 在线中文字幕播放| 色婷婷av一区二区三区大白胸| 成人黄色片视频| 黄色综合网址| 在线看不卡av| 182午夜在线观看| 91精品一区| 日韩欧美二区三区| 野战少妇38p| 日韩美女国产精品| 亚洲午夜激情免费视频| 亚洲欧美综合7777色婷婷| 欧美电影一二区| 九九热最新视频//这里只有精品| 欧美成人免费看| 亚洲人人精品| 热久久这里只有精品| 亚洲中文字幕无码爆乳av| 日韩激情在线观看| 亚洲精品免费在线视频| 亚洲乱熟女一区二区| 91网站在线播放| 日韩国产在线一区| www在线观看播放免费视频日本| 亚洲综合丝袜美腿| 国产91在线视频观看| 国产成人精品一区二区三区免费 | 国产精品嫩草影院8vv8 | 日本美女一区二区三区视频| 91免费观看网站| 日本xxxxxwwwww| 国产日本欧洲亚洲| 成人在线免费高清视频| 中文字幕一区久| 日韩一区二区三区免费看 | 琪琪久久久久日韩精品| 国产一级揄自揄精品视频| 久久中文免费视频| 亚洲欧美日本国产专区一区| 国产日本欧美一区二区三区在线| 成人h动漫精品一区二区无码| 久久综合色天天久久综合图片| 一区二区三区四区视频在线| jizz一区二区三区| 欧美午夜视频网站| 性久久久久久久久久久| 色综合蜜月久久综合网| 91国产精品91| 99热这里只有精品99| 91尤物视频在线观看| 在线国产99| 亚洲成av在线| 亚洲黄色av女优在线观看| av片在线免费看| 午夜在线精品偷拍| 国产精品区二区三区日本| 3p视频在线观看| 疯狂做受xxxx欧美肥白少妇| 在线播放黄色av| jlzzjlzz亚洲女人| 欧美在线视频网| 亚洲成人久久精品| 最新久久zyz资源站| 国产一区二区视频免费在线观看| 成人涩涩网站| 欧美人与性动交a欧美精品| 91福利在线观看视频| 久久综合999| 国产超级av在线| 大型av综合网站| 久久99热精品| 国产白浆在线观看| 亚洲特黄一级片| 亚洲欧美视频二区| 精品国产日韩欧美| 日韩免费观看视频| 色视频在线观看福利| 亚洲va国产va欧美va观看| 99久久综合网| 亚洲久久久久| 成人免费网站在线看| 9色在线视频网站| 欧洲av在线精品| 五月天综合视频| 日韩国产成人精品| 日韩av电影免费在线| 一根才成人网| 一本一道久久a久久精品逆3p| 成人精品免费在线观看| 99国内精品久久| 国产中文字幕视频在线观看| 成午夜精品一区二区三区软件| 久久国产精品久久久久久| av无码精品一区二区三区宅噜噜| 一色桃子久久精品亚洲| 91 视频免费观看| 国产精品毛片久久| 91免费人成网站在线观看18| h网站久久久| 精品va天堂亚洲国产| 国产精品999久久久| 北岛玲一区二区三区四区| 国产深夜男女无套内射| 亚洲精品动态| 国产精品999999| 久久99精品久久久久久野外| 欧美一区二区三区视频在线 | 一广人看www在线观看免费视频| 欧美亚洲国产bt| 国产中文字幕久久| 国产精品一区二区三区四区| 久久99久久99精品| 国产免费久久| 成人乱色短篇合集| sis001亚洲原创区| 在线播放日韩专区| 国产一区二区视频免费观看| 伊人色综合久久天天人手人婷| 精品伦一区二区三区| 国产免费成人| 中文字幕不卡每日更新1区2区| 久久gogo国模啪啪裸体| 97精品免费视频| 成人高清免费在线播放| 91精品国产免费| 可以免费在线观看的av| 中文在线一区二区| 性猛交╳xxx乱大交| 视频一区视频二区在线观看| 在线无限看免费粉色视频| 果冻天美麻豆一区二区国产| 国产精品久久久91| 色呦呦在线观看视频| 亚洲精品自在久久| 国产ts变态重口人妖hd| 日韩欧美在线看| 99久久99久久精品国产| 99久久er热在这里只有精品66| jizz大全欧美jizzcom| 国产精品扒开腿做爽爽爽软件| 免费久久久一本精品久久区| 精品视频在线观看免费观看| 热99精品里视频精品| www免费视频观看在线| 亚洲日韩欧美视频| 亚洲精品久久久蜜桃动漫| 色婷婷精品大在线视频| 精品无码一区二区三区电影桃花 | 日韩三级成人| 欧美在线观看日本一区| a篇片在线观看网站| 亚洲无限av看| 深夜福利免费在线观看| 91精品国产aⅴ一区二区| 在线观看亚洲黄色| 偷拍一区二区三区四区| 三上悠亚作品在线观看| 国产视频一区二区三区在线观看| 9.1在线观看免费| 国产精品一区一区三区| 国产福利影院在线观看| 国产视频一区免费看| 小泽玛利亚av在线| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 亚洲精品美女在线| 亚洲精品视频专区| 日韩欧美电影在线| 国产乱色精品成人免费视频| 欧美性大战久久久久久久蜜臀| 日韩精品一区二区av| 亚洲黄色尤物视频| 国产探花在线视频| 中文成人综合网| 手机免费看av| 久久久久国产精品麻豆ai换脸 | 欧美与欧洲交xxxx免费观看| 波多野结衣视频一区二区| 欧美不卡视频一区发布| 青青青青在线| 久久久99久久精品女同性| 免费观看成人高潮| 综合av色偷偷网| 在线免费看a| 日韩综合中文字幕| 免费在线看黄色| 久久精品国产2020观看福利| 天堂中文а√在线| 日韩视频免费观看| 韩国av网站在线| 久久精品国产欧美激情| bestiality新另类大全| 欧美大片在线影院| 2021中文字幕在线| 77777少妇光屁股久久一区| 色在线免费观看| 国产精品成人观看视频国产奇米| 欧美三级精品| 国产精品九九九| 亚洲三级电影| 51精品国产人成在线观看| 婷婷视频一区二区三区| 国产欧美一区二区视频| 台湾亚洲精品一区二区tv| 欧美少妇一区| 日韩电影在线视频| 中文字幕色呦呦| 一本色道久久综合亚洲精品不卡| 无码人妻丰满熟妇区毛片18| 日本伊人午夜精品| 午夜剧场高清版免费观看| 国产精品一区在线观看乱码| 在线观看成人动漫| 久久久久久麻豆| 亚洲色图27p| 亚洲一区在线观看免费观看电影高清| 中日韩精品视频在线观看| 日韩欧美在线字幕| 911美女片黄在线观看游戏| 精品国产乱码久久| 日韩在线免费播放| 色综合伊人色综合网| 青草在线视频| 国产成人精品久久久| 国产美女亚洲精品7777| 国产一区二区在线网站| 日韩一区欧美| 国产精品12345| 久久国产夜色精品鲁鲁99| 久久久久无码国产精品一区李宗瑞| 91在线国产观看| 视频国产一区二区| 五月天网站亚洲| 91肉色超薄丝袜脚交一区二区| 日韩视频中午一区| 国产在线视频你懂得| 欧美成人中文字幕| 台湾佬成人网| 国产91视觉| 99久久精品费精品国产风间由美| 日本福利视频一区| 另类中文字幕网| 中文字幕日韩三级片| 最新热久久免费视频| www.日韩一区| 精品国产伦一区二区三区观看体验 | 91精品国产乱码久久久竹菊| 日产精品久久久一区二区| 极品尤物久久久av免费看| 国产成年人视频网站| 久久综合色婷婷| 久久精品国产亚洲av无码娇色| 欧洲精品在线观看| 亚洲色图21p| 欧美激情乱人伦| 一区二区三区在线观看免费视频| 亚洲成av人片在线观看www| 久久久久久久久久久久久久久久av| 91精品一区国产高清在线gif| 成年网站在线免费观看| 丁香婷婷综合激情五月色| 色www亚洲国产阿娇yao| 色噜噜狠狠色综合中国| 色网站免费观看| 欧美国产日本高清在线| 国产精一区二区| 亚洲国产综合自拍| 久久精品人人| 黄色片视频免费观看| 一区二区三区国产精品| 国产精品一区二区三区在线免费观看| 国产亚洲人成a一在线v站| 欧美日韩123区| 噜噜噜噜噜久久久久久91| 亚洲性视频h| 国产污在线观看| 亚洲高清免费视频| 亚洲精品久久久久久无码色欲四季| 久久精品一区中文字幕| 免费视频观看成人| 亚洲人成网站在线播放2019| 天堂成人国产精品一区| 爱爱免费小视频| 一本色道综合亚洲| 免费一级在线观看| 欧美一区三区三区高中清蜜桃| 色婷婷综合久久久久久| 91专区在线观看| 99久久精品久久久久久清纯| 日本在线小视频| 日韩成人在线电影网| 涩涩视频在线播放| 欧美12av| 蜜桃在线一区二区三区| 成人一级片免费看| 欧美日韩久久久一区| 免费黄色电影在线观看| 91中文字幕一区| 欧美日韩亚洲一区三区 | 成人aaaa免费全部观看| 国产一级特黄a高潮片| 亚洲国产精品久久久久秋霞不卡| а√在线中文在线新版| 牛人盗摄一区二区三区视频| 日产国产高清一区二区三区| 来吧亚洲综合网| 日韩欧美你懂的| 美女扒开腿让男人桶爽久久软| 久久66热这里只有精品| 日韩综合在线视频| h色网站在线观看| 欧美精品一区二区三| 中文字幕在线免费观看视频| 午夜精品视频在线观看一区二区| 久久精品免费观看| 欧美成人精品激情在线视频| 日韩成人久久久| 欧美高清xxx| 亚洲中文字幕无码一区二区三区| 成人av电影在线观看| 99久久久久久久久| 久久久国产精品免费| 国产ts一区| 日韩av片网站| 一区二区三区高清不卡| 可以在线观看的av网站| 91精品综合久久久久久五月天| 亚洲清纯自拍| 99久久99久久精品免费看小说.| 日韩视频免费直播| 自由日本语热亚洲人| 中文精品视频一区二区在线观看| 风流少妇一区二区| 自拍偷拍福利视频| 欧美人与性动交a欧美精品| 黑丝美女一区二区| 好吊操视频这里只有精品| 色菇凉天天综合网| 日韩成人伦理| 天堂精品一区二区三区| 成人久久视频在线观看| 国产偷人爽久久久久久老妇app | 国产精品美女毛片真酒店| 国产亚洲a∨片在线观看| 视频国产精品| 久久久国产欧美| 亚洲成人精品一区二区|