サイトアイコン 上尾市のWEBプログラマーによるブログ

「はじめてつくるNext.jsサイト」の感想・備忘録1

点数

84点

感想

Next.jsの基礎がわかりやすく説明されていた。

最低限の使い方としては、本書の内容で十分だと思う。

基本

環境構築

  1. npx create-next-app next-portfolio --use-npm
  2. cd next-portfolio
  3. 不要ファイルを削除
    rm -rf pages/api/ pages/_document.js styles/Home.module.css
  4. pages/index.jsとstyles/globals.cssの中身を削除する。
    rm pages/index.js styles/globals.css
    touch pages/index.js styles/globals.css
  5. pages.index.jsを以下の内容にし、npm run devで確認
const Index = () => {
  return (
    <h1>Index</h1>
  );
};
export default Index;

CSS

CSS Modules

.h1Text {
  color: red;
}
import styles from '../styles/index.module.css'

const Index = () => {
  return (
    <h1 className={styles.h1Text}>Index</h1>
  );
};
export default Index;

Linkコンポーネント

import Link from 'next/link'
import styles from '../styles/index.module.css'

const Index = () => {
  return (
    <>
      <h1 className={styles.h1Text}>Index</h1>
      <Link href="/contact">contact</Link>
    </>
  );
};
export default Index;

<a href=”/contact”>contact</Link> でも動作はするが、画面が更新されるためスピードが遅くなる。

getStaticProps

import Link from 'next/link'

const Contact = (props) => {
  return (
    <>
      <p>staticText: {props.staticText}</p>
      {props.posts.map(post => <p key={post.id}><Link href={`/detail/${post.id}`}>{post.title}</Link>: {(new Date(post.created_at)).toLocaleString()}</p>)}
    </>
  );
};
export default Contact;

export async function getStaticProps() {
  const res = await fetch('https://qiita.com/api/v2/items');
  const posts = await res.json();
  return {
    props: {
      staticText: 'テストデータ',
      posts: posts,
    }
  }
}

ダイナミックルーティング

import { useRouter } from 'next/router';
import { useEffect,useState } from 'react';
import Link from 'next/link'

const SinglePost = () => {
  const [post, setPost] = useState({ title: '', body:'' });
  const router = useRouter();
  useEffect(() => {
    if (router.isReady) {
      fetch(`https://qiita.com/api/v2/items/${router.query.id}`)
        .then(res => res.json())
        .then(json => setPost(json));
    }
  }, [router]);
  return (
    <>
      <p>{post.title}</p>
      <pre>{post.body}</pre>
      <Link href="/contact">contact</Link>
    </>
  );
};
export default SinglePost;
モバイルバージョンを終了