【Next.js入門⑧】next-routerを使ってクエリパラメータを受け取る

f:id:nekorokkekun:20190909205514p:plain:w1000
こちらの連載記事では、Next.jsの入門チュートリアルを紹介しながら、最終的にポートフォリオファイルの完成を目指します。

筆者もNext.jsビギナーなので、同じくNext.jsに触れるのが初めてだという方を対象に書き進めていきます。

server.jの作成

まず、server.jsというファイルを作成していきましょう。

初めに以下のコマンドをターミナルから入力します。

npm install --save express

次に以下のファイルを作成します。
server.js

const express = require('express')
const next = require('next')
const routes = require('./routes')

const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = routes.getRequestHandler(app)

app.prepare()
.then(() => {
    const server = express()

    server.get('*', (req, res) => {
        return handle(req, res)
    })

    server.listen(3000, (err) => {
        if(err) throw err
        console.log('> Ready on http://localhost:3000')
    })
})
.catch((ex) => {
    console.error(ex.stack)
    process.exit(1)
})

next-routerの導入

次にnext-routerを導入します。

npm install next-routes --save


以下のファイルを作成します。
routes.js

const routes = require('next-routes')

module.exports = routes()
.add('test', '/test/:id')

pages/test.js

import React from 'react';
import BaseLayout from '../components/layouts/BaseLayout';
import { withRouter } from 'next/router';
import axios from 'axios';

class Test extends React.Component {

    static async getInitialProps({query}) {
        const testId = query.id
        return {testId};
    }

    render() {
        const {testId} = this.props;
        return (
            <BaseLayout>
                <h1>I am Test Page with id of {testId}</h1>
            </BaseLayout>
        )
    }
}

export default withRouter(Test);

さて、ここまで書けたら
http://localhost:3000/test/1
にアクセスを指定みましょう。

そうするとtest.jsが表示され、クエリパラメータの数字が表示されるはずです。
next-routerを使うことでクエリパラメータの値を受け取り、それに応じて表示を切り替えることができます。


ヘッダーメニューに、next-routerを利用したタグの配置をしておきましょう。

components/shared/Header.js

import React from 'react'
import Link from 'next/link'
import '../../styles/main.scss'
import {Link as NextLink} from '../../routes' // Add

class Header extends React.Component {
    render() {
        const title = this.props.title;
        const child = this.props.children;
        return (
    // 省略
                <Link href='/cv'>
                    <a>CV</a>
                </Link>
                <NextLink route='test' params={{id: 2}}>Test2</NextLink> // Add
                <NextLink route='/test/5'>Test5</NextLink> // Add
                <style jsx>{`
    // 省略

上記のように書くことで、クエリパラメータを渡すことも可能です。

クエリパラメータを渡す際に2通りの方法がありますが、どちらでも構いません。

<NextLink route='test' params={{id: 2}}>Test2</NextLink> // Add
<NextLink route='/test/5'>Test5</NextLink> // Add