摘要:原始文檔在現(xiàn)在搬過(guò)來(lái)學(xué)習(xí)入門學(xué)習(xí)頁(yè)面之間的導(dǎo)航學(xué)習(xí)使用共享組件學(xué)習(xí)創(chuàng)建動(dòng)態(tài)內(nèi)容學(xué)習(xí)使用路由掩碼創(chuàng)建干凈的學(xué)習(xí)干凈的服務(wù)器支持學(xué)習(xí)獲取數(shù)據(jù)學(xué)習(xí)部署為頁(yè)面獲取數(shù)據(jù)得益于路由的優(yōu)點(diǎn)我們知道了如何創(chuàng)建一個(gè)具有簡(jiǎn)介的應(yīng)用程序?qū)嶋H上我們通常需要從遠(yuǎn)程數(shù)
為頁(yè)面獲取數(shù)據(jù)原始文檔在 https://github.com/developerw... 現(xiàn)在搬過(guò)來(lái).
學(xué)習(xí) Next.js: 入門
學(xué)習(xí) Next.js: 頁(yè)面之間的導(dǎo)航
學(xué)習(xí) Next.js: 使用共享組件
學(xué)習(xí) Next.js: 創(chuàng)建動(dòng)態(tài)內(nèi)容
學(xué)習(xí) Next.js: 使用路由掩碼創(chuàng)建干凈的URL
學(xué)習(xí) Next.js: 干凈URL的服務(wù)器支持
學(xué)習(xí) Next.js: 獲取數(shù)據(jù)
學(xué)習(xí) Next.js: 部署
得益于 Next.js 路由API的優(yōu)點(diǎn), 我們知道了如何創(chuàng)建一個(gè)具有簡(jiǎn)介URL的 Next.js 應(yīng)用程序.
實(shí)際上, 我們通常需要從遠(yuǎn)程數(shù)據(jù)源獲取數(shù)據(jù). Next.js 提供了一個(gè)標(biāo)準(zhǔn)API用于為頁(yè)面獲取數(shù)據(jù). 我們使用一個(gè) async 函數(shù) getInitialProps 來(lái)達(dá)到獲取數(shù)據(jù)的目的.
以此為基礎(chǔ), 我們能夠給以頁(yè)面從遠(yuǎn)程數(shù)據(jù)源獲取數(shù)據(jù), 然后把數(shù)據(jù)穿給我們的一個(gè)頁(yè)面組件的屬性. 我們可以編寫getInitialProps函數(shù)讓他能夠同時(shí)在客戶端和服務(wù)器端運(yùn)行.
在這節(jié)課中, 使用 getInitialProps, 我們將使用 TVmaze API構(gòu)造一個(gè)顯示Batman TV Shows 相關(guān)信息的應(yīng)用程序.
現(xiàn)在開(kāi)始!
設(shè)置下載需要的示例程序:
git clone https://github.com/arunoda/learnnextjs-demo.git cd learnnextjs-demo git checkout clean-urls-ssr
用下面的命令運(yùn)行:
npm install npm run dv
然后, 訪問(wèn) http://localhost:3000
獲取 Batman Shows在我們的演示程序中, 顯示了一個(gè)博客列表, 現(xiàn)在我們改造演示程序以要顯示一個(gè)Batman TV shows列表.
和之前博客列表的硬編碼方式不同, 這次我們從遠(yuǎn)程服務(wù)器獲取列表數(shù)據(jù)
這里我們使用 TVMaze API 獲取電視節(jié)目信息. 它是一個(gè)搜索電視節(jié)目信息的API.
首先, 我們需要按照 isomorphic-unfetch. 我們使用這個(gè)庫(kù)來(lái)獲取數(shù)據(jù). 它是一個(gè)瀏覽器 fetch 的簡(jiǎn)單實(shí)現(xiàn), 并且可以同時(shí)工作在客戶端和服務(wù)器端環(huán)境中.
譯注: 這類能夠同時(shí)在客戶端和服務(wù)器運(yùn)行的應(yīng)用程序, 我們稱之為同構(gòu)應(yīng)用程序
然后, 用下面的代碼, 替換 pages/index.js 文件:
import Layout from "../components/MyLayout.js" import Link from "next/link" import fetch from "isomorphic-unfetch" const Index = (props) => () Index.getInitialProps = async function() { const res = await fetch("http://api.tvmaze.com/search/shows?q=batman") const data = await res.json() console.log(`Show data fetched. Count: ${data.length}`) return { shows: data } } export default Index Batman TV Shows
{props.shows.map(({show}) => (
- {show.name}
))}
到現(xiàn)在, 上面的代碼一切看來(lái)都是很熟悉了, 除了 Index.getInitialProps:
Index.getInitialProps = async function() { const res = await fetch("http://api.tvmaze.com/search/shows?q=batman") const data = await res.json() console.log(`Show data fetched. Count: ${data.length}`) return { shows: data } }
這是一個(gè)靜態(tài)的 async, 可以把它添加到應(yīng)用程序中的任何頁(yè)面. 使用它, 我們可以獲取數(shù)據(jù), 并且作為頁(yè)面組件的屬性使用.
如你所見(jiàn), 現(xiàn)在, 我們要獲取 Batman TV 電視節(jié)目信息, 并且把獲取的節(jié)目信息, 作為頁(yè)面組件的 shows 屬性進(jìn)行訪問(wèn).
如你所見(jiàn), 上面的 getInitialProps 函數(shù), 它打印一系列獲取到的數(shù)據(jù)到控制臺(tái).
現(xiàn)在, 看一下瀏覽器的控制臺(tái)和服務(wù)器的控制臺(tái)輸出. 然后重新加載頁(yè)面.
僅服務(wù)器本來(lái)我們預(yù)想的, 客戶端和服務(wù)器都能輸出同樣的信息, 但實(shí)際上, 在這種情況下, 輸出信息只顯示在了服務(wù)器端的控制臺(tái)上. 這是因?yàn)? 我們的頁(yè)面是在服務(wù)器端進(jìn)行渲染的. 我們?cè)诜?wù)器上已經(jīng)獲取到了電視節(jié)目的數(shù)據(jù), 沒(méi)有理由在客戶端再獲取一次.
實(shí)現(xiàn)信息展示頁(yè)面現(xiàn)在我們要實(shí)現(xiàn)一個(gè) /post 頁(yè)面來(lái)展示電視節(jié)目的詳細(xì)信息.
首先, 打開(kāi) server.js 文件, 用下面的代碼修改路由 /p/:id:
server.get("/p/:id", (req, res) => { const actualPage = "/post" const queryParams = { id: req.params.id } app.render(req, res, actualPage, queryParams) })
然后, 重啟應(yīng)用程序
先前, 我們映射了 title 查詢參數(shù)到頁(yè)面, 現(xiàn)在我們重命名為 id.
現(xiàn)在, 用下面的代碼替換 pages/post.js 的內(nèi)容:
import Layout from "../components/MyLayout.js" import fetch from "isomorphic-unfetch" const Post = (props) => () Post.getInitialProps = async function (context) { const { id } = context.query const res = await fetch(`http://api.tvmaze.com/shows/${id}`) const show = await res.json() console.log(`Fetched show: ${show.name}`) return { show } } export default Post {props.show.name}
{props.show.summary.replace(/<[/]?p>/g, "")}
我們?cè)賮?lái)看一下 getInitialProps 函數(shù):
Post.getInitialProps = async function (context) { const { id } = context.query const res = await fetch(`http://api.tvmaze.com/shows/${id}`) const show = await res.json() console.log(`Fetched show: ${show.Title}`) return { show } }
現(xiàn)在這個(gè)函數(shù)的第一個(gè)參數(shù)為一個(gè) context 對(duì)象, 其中包含了我們用于獲取信息的查詢字段.
在我們這個(gè)例子中, 我們從查詢串中獲取電視節(jié)目ID, 然后通過(guò)它來(lái)從 TVMaze API 獲取數(shù)據(jù).
在 getInitialProps函數(shù)中, 我們添加了一個(gè) console.log 調(diào)試輸出來(lái)顯示電視節(jié)目的標(biāo)題. 下面我們來(lái)驗(yàn)證我們的程序是否能夠正確運(yùn)行.
打開(kāi)服務(wù)器和客戶端控制臺(tái), 訪問(wèn) http://localhost:3000, 點(diǎn)擊第一個(gè)電視節(jié)目標(biāo)題.
輸出顯示在客戶端還是服務(wù)器控制臺(tái)?
從客戶端獲取數(shù)據(jù)這里, 我們只在客戶端的控制臺(tái)上看到了調(diào)試輸入. 這是因?yàn)槲覀兪峭ㄟ^(guò)客戶端進(jìn)行導(dǎo)航的. 因此從客戶端獲取數(shù)據(jù)是更好的方式.
如果你直接訪問(wèn)Post頁(yè)面(例如: http://localhost:3000/p/975), 你將會(huì)看到調(diào)試輸出顯示在了服務(wù)器端而非客戶端.
最后現(xiàn)在你學(xué)到了 Next.js 最為關(guān)鍵的特性: 通用數(shù)據(jù)獲取和服務(wù)器端渲染(SRR).
我們了解了 getInitialProps, 在大多數(shù)情況下, 就足夠了. 如果你要了解關(guān)于數(shù)據(jù)獲取的更加深入的信息, 參考data fetching 文檔.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/83269.html
摘要:原始文檔在現(xiàn)在搬過(guò)來(lái)學(xué)習(xí)入門學(xué)習(xí)頁(yè)面之間的導(dǎo)航學(xué)習(xí)使用共享組件學(xué)習(xí)創(chuàng)建動(dòng)態(tài)內(nèi)容學(xué)習(xí)使用路由掩碼創(chuàng)建干凈的學(xué)習(xí)干凈的服務(wù)器支持學(xué)習(xí)獲取數(shù)據(jù)學(xué)習(xí)部署創(chuàng)建動(dòng)態(tài)頁(yè)面現(xiàn)在我們知道了如何使用多個(gè)頁(yè)面創(chuàng)建一個(gè)基本的應(yīng)用程序?yàn)榱藙?chuàng)建頁(yè)面我們需要在磁盤上創(chuàng)建 原始文檔在 https://github.com/developerw... 現(xiàn)在搬過(guò)來(lái). 學(xué)習(xí) Next.js: 入門學(xué)習(xí) Next.js: ...
摘要:原始文檔在現(xiàn)在搬過(guò)來(lái)學(xué)習(xí)入門學(xué)習(xí)頁(yè)面之間的導(dǎo)航學(xué)習(xí)使用共享組件學(xué)習(xí)創(chuàng)建動(dòng)態(tài)內(nèi)容學(xué)習(xí)使用路由掩碼創(chuàng)建干凈的學(xué)習(xí)干凈的服務(wù)器支持學(xué)習(xí)獲取數(shù)據(jù)學(xué)習(xí)部署干凈的服務(wù)器支持在前面的課程中我們學(xué)習(xí)了如何為我們的應(yīng)用程序創(chuàng)建干凈的基本上我們讓像這樣但是 原始文檔在 https://github.com/developerw... 現(xiàn)在搬過(guò)來(lái). 學(xué)習(xí) Next.js: 入門學(xué)習(xí) Next.js: 頁(yè)面...
摘要:原始文檔在現(xiàn)在搬過(guò)來(lái)學(xué)習(xí)入門學(xué)習(xí)頁(yè)面之間的導(dǎo)航學(xué)習(xí)使用共享組件學(xué)習(xí)創(chuàng)建動(dòng)態(tài)內(nèi)容學(xué)習(xí)使用路由掩碼創(chuàng)建干凈的學(xué)習(xí)干凈的服務(wù)器支持學(xué)習(xí)獲取數(shù)據(jù)學(xué)習(xí)部署使用共享組件我們知道是和頁(yè)面相關(guān)的通過(guò)導(dǎo)出一個(gè)組件創(chuàng)建一個(gè)頁(yè)面然后把它放到目錄中基于這個(gè)文件名存 原始文檔在 https://github.com/developerw... 現(xiàn)在搬過(guò)來(lái). 學(xué)習(xí) Next.js: 入門學(xué)習(xí) Next.js: ...
摘要:原始文檔在現(xiàn)在搬過(guò)來(lái)學(xué)習(xí)入門學(xué)習(xí)頁(yè)面之間的導(dǎo)航學(xué)習(xí)使用共享組件學(xué)習(xí)創(chuàng)建動(dòng)態(tài)內(nèi)容學(xué)習(xí)使用路由掩碼創(chuàng)建干凈的學(xué)習(xí)干凈的服務(wù)器支持學(xué)習(xí)獲取數(shù)據(jù)學(xué)習(xí)部署哪位分高的幫忙創(chuàng)建一個(gè)的標(biāo)簽謝謝現(xiàn)暫時(shí)放在標(biāo)簽下面了新建文章有時(shí)間限制一會(huì)全部發(fā)上來(lái)這是最近兩天 原始文檔在 https://github.com/developerw... 現(xiàn)在搬過(guò)來(lái). 學(xué)習(xí) Next.js: 入門學(xué)習(xí) Next.js: ...
摘要:原始文檔在現(xiàn)在搬過(guò)來(lái)學(xué)習(xí)入門學(xué)習(xí)頁(yè)面之間的導(dǎo)航學(xué)習(xí)使用共享組件學(xué)習(xí)創(chuàng)建動(dòng)態(tài)內(nèi)容學(xué)習(xí)使用路由掩碼創(chuàng)建干凈的學(xué)習(xí)干凈的服務(wù)器支持學(xué)習(xí)獲取數(shù)據(jù)學(xué)習(xí)部署使用路由掩碼創(chuàng)建干凈的在前面的課程中我們學(xué)到了如何使用查詢串創(chuàng)建動(dòng)態(tài)頁(yè)面一次為基礎(chǔ)我們一篇博客的 原始文檔在 https://github.com/developerw... 現(xiàn)在搬過(guò)來(lái). 學(xué)習(xí) Next.js: 入門學(xué)習(xí) Next.js: ...
閱讀 3486·2021-11-18 10:07
閱讀 1586·2021-11-04 16:08
閱讀 1502·2021-11-02 14:43
閱讀 1083·2021-10-09 09:59
閱讀 837·2021-09-08 10:43
閱讀 1073·2021-09-07 09:59
閱讀 954·2019-12-27 11:56
閱讀 994·2019-08-30 15:56