国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

學(xué)習(xí) Next.js: 獲取數(shù)據(jù)

NotFound / 623人閱讀

摘要:原始文檔在現(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ù)

原始文檔在 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: 部署

為頁(yè)面獲取數(shù)據(jù)

得益于 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) => (
  
    

Batman TV Shows

) 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

到現(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) => (
    
       

{props.show.name}

{props.show.summary.replace(/<[/]?p>/g, "")}

) 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

我們?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

相關(guān)文章

  • 學(xué)習(xí) Next.js: 創(chuàng)建動(dòng)態(tài)內(nèi)容

    摘要:原始文檔在現(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: ...

    caohaoyu 評(píng)論0 收藏0
  • 學(xué)習(xí) Next.js: 清潔URL的服務(wù)器支持

    摘要:原始文檔在現(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è)面...

    Lionad-Morotar 評(píng)論0 收藏0
  • 學(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í)部署使用共享組件我們知道是和頁(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: ...

    Steve_Wang_ 評(píng)論0 收藏0
  • 學(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: ...

    Miracle 評(píng)論0 收藏0
  • 學(xué)習(xí) Next.js: 使用路由掩碼創(chuàng)建干凈的URL

    摘要:原始文檔在現(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: ...

    silenceboy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<