はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Next.js】Next.jsの公式の入門をやってみた⑧

はじめに

今回は”Fetching Data for Pages”を進めていきましょう。

セットアップ

今回も変わらず前回の続きを使っていきます。

ページのデータを取得する

さすがアメリカといいますか、今回はバットマンテレビ番組のリストを表示していきたいと思います。

番組情報を取得するためにTVMaze APIを利用します。
TV API | TVmaze - Add TV information to your website or app.

次に'isomorphic-unfetch'をインストールします。
これはデータを取得するために使用するライブラリみたいです。

コマンドプロンプトに以下のコードを打ち込みましょう。

npm install --save isomorphic-unfetch

pagesフォルダのindex.jsを書き換えましょう。

import Layout from '../components/MyLayout.js'
import Link from 'next/link'
import fetch from 'isomorphic-unfetch'

const Index = (props) => (
  <Layout>
    <h1>Batman TV Shows</h1>
    <ul>
      {props.shows.map(({show}) => (
        <li key={show.id}>
          <Link as={`/p/${show.id}`} href={`/post?id=${show.id}`}>
            <a>{show.name}</a>
          </Link>
        </li>
      ))}
    </ul>
  </Layout>
)

Index.getInitialProps = async function() {
  const res = await fetch('https://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

Index.getInitialProps以下のところが今回のメインになります。

これは静的非同期関数といい、データを取得して自分のページに送ることができます。

f:id:hanaaaaaachiru:20190116011938p:plain

投稿ページを実装する

テレビ番組に関する詳細情報を表示する「/ post」ページを実装します。
server.jsの中身を変更します。

server.get('/p/:id', (req, res) => {
    const actualPage = '/post'
    const queryParams = { id: req.params.id }
    app.render(req, res, actualPage, queryParams)
})

さらに、pagesフォルダのpost.jsを書き換えます。

import Layout from '../components/MyLayout.js'
import fetch from 'isomorphic-unfetch'

const Post = (props) => (
    <Layout>
       <h1>{props.show.name}</h1>
       <p>{props.show.summary.replace(/<[/]?p>/g, '')}</p>
       <img src={props.show.image.medium}/>
    </Layout>
)

Post.getInitialProps = async function (context) {
  const { id } = context.query
  const res = await fetch(`https://api.tvmaze.com/shows/${id}`)
  const show = await res.json()

  console.log(`Fetched show: ${show.name}`)

  return { show }
}

export default Post

ローカルホストをみてみると、

f:id:hanaaaaaachiru:20190116122054p:plain

f:id:hanaaaaaachiru:20190116122134p:plain

無事ページのデータを取得できました!

さいごに

お疲れ様です、これで”Fetching Data for Pages”は終わりになります。

デプロイまでもう少しなので、頑張りましょう!

【Next.js】Next.jsの公式の入門をやってみた⑨ - はなちるのマイノート