Warning: count(): Parameter must be an array or an object that implements Countable in /home/xs638785/agile-software.site/public_html/wp-content/plugins/rich-table-of-content/functions.php on line 490
Next.jsのインポート
https://www.agile-software.site/2021/05/06/node-js/tailwindcssのインポート
$ npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
$ npx tailwindcss init -p
module.exports = {
purge: ["./pages/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}"],
darkMode: false, // or 'media' or 'class'
theme: {
extend: {},
},
variants: {
extend: {},
},
plugins: [],
};
@tailwind base;
@tailwind components;
@tailwind utilities;
layout.js
ナビゲーションやフッターなどのページで共通の部分をlayout.jsに書くことになります。
import Navigation from "./navigation";
export default function Layout(props) {
return (
<div className="flex flex-col min-h-screen">
<Navigation />
<main className="container flex flex-1 justify-center mx-auto px-5 max-w-screen-lg">
{props.children}
</main>
<footer className="flex items-center justify-center w-full h-20 text-sm border-t">
© 2021 NextJS Startup
</footer>
</div>
);
}
navigation.js
import Link from "next/link";
export default function Navigation() {
return (
<header className="container flex flex-row items-center mx-auto px-5 py-14 max-w-screen-lg">
<Link href="/">
<a className="text-4xl font-bold text-red-300">NextJS Startup</a>
</Link>
<nav className="ml-auto">
<Link href="/about">
<a className="mr-5">About</a>
</Link>
</nav>
</header>
);
}
詳細ページ
_app.jsですべてのページを初期化している。
import "../styles/globals.css";
import Head from "next/head";
import Layout from "../components/layout/layout";
function MyApp({ Component, pageProps }) {
return (
<Layout>
<Head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</Head>
<Component {...pageProps} />
</Layout>
);
}
export default MyApp;
詳細ページ
export default function About() {
return <div>about</div>;
}
トップページ
import Image from "next/image";
import Head from "next/head";
export default function Home() {
return (
<div>
<Head>
<title>NextJS Startup</title>
</Head>
<div className="mb-10 p-3 border rounded">
<Image
className="object-cover rounded"
src="/top.png"
alt="top"
width={1280}
height={500}
/>
</div>
<div className="flex justify-center flex-col items-center mb-10">
<div className="text-lg mb-3">BLOG POSTS</div>
<div className="border w-14"></div>
</div>
</div>
);
}
API連携
Next.js から Django の API をコールします。
投稿一覧を取得
const res = await fetch(new URL(`${SERVERURL}api/post/`));
取得した投稿一覧をjson形式に変換
const posts = await res.json();
map関数を使ってid取得
return posts.map((post) => {
return {
params: {
id: String(post.id),
},
};
});
import fetch from "node-fetch";
// Django APIサーバーURL
const SERVERURL = "http://127.0.0.1:8000/";
// 投稿一覧を取得
export async function getAllPostsData() {
const res = await fetch(new URL(`${SERVERURL}api/post/`));
const posts = await res.json();
return posts;
}
// 投稿一覧のIDを取得
export async function getAllPostIds() {
const res = await fetch(new URL(`${SERVERURL}api/post/`));
const posts = await res.json();
return posts.map((post) => {
return {
params: {
id: String(post.id),
},
};
});
}
// 投稿詳細を取得
export async function getPostData(id) {
const res = await fetch(new URL(`${SERVERURL}api/post/${id}/`));
const post = await res.json();
return post;
}