はじめに
今回は”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以下のところが今回のメインになります。
これは静的非同期関数といい、データを取得して自分のページに送ることができます。
投稿ページを実装する
テレビ番組に関する詳細情報を表示する「/ 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
ローカルホストをみてみると、
無事ページのデータを取得できました!
さいごに
お疲れ様です、これで”Fetching Data for Pages”は終わりになります。
デプロイまでもう少しなので、頑張りましょう!