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

天天干天天干天天| 日本成人xxx| 免费毛片在线| 久久精品国产精品青草| 欧美另类第一页| 久久精品女同亚洲女同13| 神马久久资源| 亚洲美女视频一区| 电影午夜精品一区二区三区 | 国产按摩一区二区三区| 国产精品chinese| 一本色道久久88精品综合| 九九久久久久久| 中文字幕高清在线播放| 亚洲欧洲精品成人久久奇米网| 国产精品一区免费观看| 中国a一片一级一片| 亚洲视频狠狠| 精品国内自产拍在线观看| 欧产日产国产精品98| 福利精品在线| 欧美特级www| 超级碰在线观看| 国产九九在线| 白白色亚洲国产精品| 成人h片在线播放免费网站| av黄色在线播放| 影音先锋中文字幕一区| 久久精品国产一区二区电影| 天堂久久精品忘忧草| 亚洲成人五区| 在线综合视频播放| 久久久国产欧美| 乱人伦视频在线| 亚洲一区二区四区蜜桃| 一区二区视频在线观看| 九色蝌蚪在线| 99久久精品国产一区二区三区| 亚洲xxxx3d| 亚洲精品国产精品乱码视色| 噜噜噜躁狠狠躁狠狠精品视频 | 欧美黄色一级大片| 亚洲免费黄色| 91国产中文字幕| 国产性70yerg老太| 欧美日本一区| 欧美老少配视频| 久久免费看少妇高潮v片特黄| 日韩综合一区| 最近免费中文字幕视频2019| 色综合99久久久无码国产精品| 亚洲日产av中文字幕| 亚洲精品按摩视频| 99re久久精品国产| 极品尤物一区| 日韩精品电影网| av网站免费在线播放| 日韩电影不卡一区| 亚洲免费一在线| 熟女少妇一区二区三区| 猛男gaygay欧美视频| 亚洲裸体xxxx| 无码一区二区三区在线| 欧美日中文字幕| 日韩在线中文字| 日本一二三区在线观看| 综合国产在线| 午夜精品福利电影| 亚洲欧美综合自拍| 久久精品国产精品亚洲红杏| 91色视频在线导航| 韩国av永久免费| av成人动漫在线观看| 美女被啪啪一区二区| 国产1区2区3区在线| 国产精品久久久久久久久免费相片 | 亚欧日韩另类中文欧美| 国产亚洲精品久久久久久| аⅴ天堂中文在线网| 香蕉视频官网在线观看日本一区二区| 欧美成人亚洲成人| 日本熟女一区二区| 久久久久久久波多野高潮日日| 国产精品一区专区欧美日韩| www香蕉视频| 91免费精品国自产拍在线不卡| 日韩电影免费观看在| 国产网友自拍视频导航网站在线观看 | 美女视频网站久久| 国产精品免费观看高清| 青春草在线观看| 国产精品进线69影院| 中文精品无码中文字幕无码专区| 最新日韩精品| 欧美一区二区精美| 亚洲国产欧美视频| 亚洲字幕久久| 日本成人免费在线| 精品久久久免费视频| 91免费国产视频网站| 一区二区在线中文字幕电影视频| 色a资源在线| 欧美最猛黑人xxxxx猛交| 伊人国产精品视频| 国产欧美日韩| 欧美极品美女电影一区| 中文字幕一区二区免费| av在线免费不卡| 中文字幕日韩一区二区三区| av免费不卡| 日韩一区二区三区电影| 美女爆乳18禁www久久久久久 | 久久无码高潮喷水| 警花av一区二区三区| 亚洲午夜精品久久久久久性色| 久久综合加勒比| 精品一区二区三区久久| 欧洲久久久久久| 99re6在线精品视频免费播放| 91精品国产综合久久久久久久 | 欧美美乳视频| 97精品国产97久久久久久春色| 国产一区二区三区成人| 国产日产欧美一区| 男女啪啪免费视频网站| 秋霞影院一区| 日韩一区二区三区xxxx| 黄色一级视频免费看| 成人国产精品免费观看视频| 无码人妻精品一区二区三区99v| 午夜av成人| 亚洲精品一区二区三区婷婷月| 久久精品国产av一区二区三区| 国内精品不卡在线| 亚洲欧美日韩在线综合 | 欧美 日韩 成人| 国产农村妇女毛片精品久久莱园子 | 欧美日韩大尺度| 亚洲欧洲色图| 欧美一级电影免费在线观看| 涩涩视频免费看| 亚洲福利一区二区三区| 国产免费无码一区二区| 亚洲天天综合| 亚洲www永久成人夜色| 黄色在线免费| 欧美电影一区二区三区| 青青操在线视频观看| 久久97超碰国产精品超碰| 少妇精品久久久久久久久久| 91精品美女| 少妇高潮久久77777| 中文字幕在线播出| 国产精品久久久久四虎| 红桃视频 国产| 午夜久久免费观看| 99久久精品免费看国产四区| 欧美伦理免费在线| 亚洲国产天堂网精品网站| 日韩精品成人一区| 久久久久亚洲蜜桃| 青青草精品视频在线观看| 久久视频在线| 7777精品伊久久久大香线蕉语言| 污片视频在线免费观看| 精品福利视频一区二区三区| 日韩免费黄色片| 91蜜桃网址入口| www.99在线| 影音先锋日韩在线| 国产女主播一区二区| 亚洲一区站长工具| 中文字幕亚洲精品| 精品国产无码AV| 午夜精品福利在线| 影音先锋男人在线| 国产激情视频一区二区三区欧美| 女人帮男人橹视频播放| 狠狠做六月爱婷婷综合aⅴ | 久久久久久久久久亚洲| 日韩一二三四| 欧美片网站yy| 久青草视频在线观看| 久久蜜桃香蕉精品一区二区三区| 91淫黄看大片| 欧美日本三区| 欧美综合激情| 综合激情久久| 国产激情久久久| 成人在线免费看片| 日韩经典中文字幕| 国产av一区二区三区| 欧美性黄网官网| 免费在线观看h片| 久久这里只有精品视频网| 婷婷激情综合五月天| 亚洲在线观看| 8x8x华人在线| 欧美日韩在线网站| 精品国产_亚洲人成在线| 九九久久国产| 77777少妇光屁股久久一区| 色影院视频在线| 日韩精品中文字| 国产哺乳奶水91在线播放| 欧美主播一区二区三区| 久久免费黄色网址| 国产精品视频第一区| 日韩免费高清一区二区| 国产一区二区三区黄视频 | 一区二区三区四区在线看| 91在线中文字幕| 日韩欧美精品一区二区综合视频| 欧美丰满片xxx777| 免费高清在线观看| 亚洲深夜福利视频| 天天操天天干天天爽| 欧美一区二区三区男人的天堂| 无码人妻av一区二区三区波多野| 一区二区三区加勒比av| 成人18视频免费69| 久久久精品中文字幕麻豆发布| 精品无码人妻少妇久久久久久| 精品一区二区在线看| 国产第一页视频| 在线亚洲一区| 久久99中文字幕| 综合久久亚洲| 日本a级片在线观看| 久久福利综合| 亚洲精品视频一二三| 精品精品99| 日韩av电影免费观看| 亚洲欧美tv| 欧美高清视频一区| 任你弄精品视频免费观看| 国产v亚洲v天堂无码| 亚洲精品福利| 99热99热| 都市激情亚洲欧美| 国产精品国色综合久久| av日韩在线播放| 国产超碰91| 成人另类视频| 国产日韩欧美精品| 国产精品毛片视频| 国产一区二区三区奇米久涩 | 精品国产乱码久久久久久1区2区| 国产免费黄色网址| 91精品在线一区二区| 国产精品久久久久久久免费看| 91麻豆精品国产自产在线观看一区| 中文字幕一区二区三区四区免费看 | 久久精品国产亚洲| gogo在线高清视频| 久久久久久国产精品| aa级大片免费在线观看| 91av在线免费观看| 成人直播视频| 国产精品久久久久秋霞鲁丝| 视频欧美精品| 亚洲xxxxx性| 国产欧美一区二区三区米奇| 国产日韩一区二区三区| 色狼人综合干| 日韩三级电影网站| 999视频精品| 国产一二三四区在线观看| 亚洲黄色免费| xxxx一级片| 国产精品中文有码| 粉嫩av懂色av蜜臀av分享| 国产视频一区二区在线观看| 在线观看日本黄色| 亚洲黄色录像片| 三级视频在线观看| 欧美日韩和欧美的一区二区| 国产www免费观看| 亚洲精品日韩丝袜精品| 免费观看成人高潮| 97精品免费视频| 亚洲电影有码| 成人av资源网| 九九热爱视频精品视频| 久久av喷吹av高潮av| 亚洲精品系列| xx欧美撒尿嘘撒尿xx| 懂色av一区二区夜夜嗨| av黄色在线免费观看| 亚洲男人天堂av| 国产又大又黄又粗| 91麻豆精品国产91久久久久久| 色婷婷av一区二区三区之红樱桃| 一本一本久久a久久精品牛牛影视| 天堂地址在线www| 91精品国产乱码久久久久久蜜臀| 69堂精品视频在线播放| 99re6热在线精品视频播放速度| 九九热精品视频在线观看| 亚洲黄色网址在线观看| 美女黄色成人网| 免费观看一区二区三区| 国产日产亚洲精品系列| 国产乡下妇女做爰视频| 欧美老女人第四色| 日本1级在线| 欧美激情精品久久久久久大尺度 | 永久免费毛片在线观看| 亚洲大型综合色站| 国产永久免费视频| 亚洲欧美日韩精品| av不卡高清| 3d蒂法精品啪啪一区二区免费| 精品免费一区二区| 日本免费不卡一区二区| 国产一区二区三区高清播放| 一级黄色片大全| 欧美日韩亚洲高清| 亚洲av无码一区二区三区性色| 最近2019免费中文字幕视频三| 五月天av在线| 国产精品亚洲不卡a| 亚洲天堂免费| 久久6免费视频| 欧美国产日韩a欧美在线观看| 国内免费精品视频| 精品奇米国产一区二区三区| 久草免费在线| 国产一区二区在线播放| 成人羞羞视频播放网站| 亚洲精品无码久久久久久| caoporen国产精品视频| 国产一级视频在线观看| 欧美一区二区精美| 黄色片网站在线观看| 国产女人18毛片水18精品| 国产成人手机高清在线观看网站| 日韩在线综合网| 久久综合狠狠综合| 男人日女人网站| 精品视频偷偷看在线观看| 超碰一区二区| 久久综合久久综合这里只有精品| 亚洲免费精品| 亚洲专区区免费| 在线影院国内精品| 激情视频在线观看免费| 国产激情999| 色狮一区二区三区四区视频| 国产欧美一区二区三区另类精品 | 亚洲一区3d动漫同人无遮挡 | 在线观看欧美黄色| 精品乱码一区二区三四区视频 | 国产又粗又猛又爽又黄的视频一| 中文字幕av一区| 成人影院网站ww555久久精品| 在线视频不卡国产| 国产一区二区久久| 久久久综合久久久| 日韩大陆欧美高清视频区| 在线观看爽视频| 亚洲高清资源综合久久精品| 久久成人免费网| 欧美日韩精品亚洲精品| 亚洲成人av资源网| 新版的欧美在线视频| 欧美亚洲免费在线| 美女免费视频一区二区| 成人免费视频国产免费观看| 精品久久久久久久久久久久久久久久久| 欧美极品少妇videossex| 精品国产一区二区三区日日嗨| 美女久久一区| 亚洲欧美另类日本| 欧美成人在线直播| 男人天堂视频在线观看| 日本在线观看一区二区| 国产专区欧美精品| 国产无码精品在线播放| 亚洲欧美另类人妖| 成人自拍视频| 男人用嘴添女人下身免费视频| 国产日韩亚洲欧美综合| 亚洲天堂一二三| 久久久欧美一区二区| 九九热线有精品视频99| 天天干天天曰天天操| 欧美日韩美女视频| 日本蜜桃在线观看| 国产日韩欧美一区二区| 久久激情综合网| 99久在线精品99re8热| 少妇高潮 亚洲精品| 欧美天堂影院| 欧美成人乱码一二三四区免费| 亚洲图片一区二区| 色影院视频在线| 久久久久久艹| 国产一区二区三区久久悠悠色av| 久久久久99精品成人片我成大片 |