Install nextjs npx create-next-app@latest https://nextjs.org/docs/getting-started/installation
Install the following
SWR React Hooks for Data Fetching
npm i swr
https://swr.vercel.app/docs/getting-started
app\page.tsx
//app\page.tsx
import Post from "./components/post";
export default function Home() {
return (
<div className="max-w-7xl flex flex-col gap-10 mx-auto p-10">
<div className="flex justify-between items-center">
<h1 className="text-4xl font-bold">Nextjs Data fetching using SWR</h1>
</div>
<Post />
</div>
);
}
app\components\post.tsx
//app\components\post.tsx
"use client";
import useSWR from "swr"; //npm i swr https://swr.vercel.app/docs/getting-started
const fetcher = (url) => fetch(url).then((res) => res.json());
export default function Home() {
const {
data: posts,
isLoading,
isError: error,
} = useSWR(
'https://jsonplaceholder.typicode.com/posts',
fetcher,
{ revalidateOnFocus: false, revalidateOnReconnect: false }
);
if (error) {
return <p className='text-secondary'>Failed to fetch</p>;
}
return (
<>
<header className='p-7 text-center'>
<h1 className='text-secondary font-bold text-xl'>Basic</h1>
</header>
<main className='max-w-[1100px] mx-auto mt-10 pb-10 px-4'>
{isLoading ? (
<p className='text-secondary'>Loading posts</p>
) : (
<ul className='grid grid-cols-3 gap-x-3 gap-y-3'>
{posts.map((post, index) => (
<li className='bg-primary p-10 rounded-lg shadow-md border border-gray-200' key={index}>
<span className='block mb-4 font-bold text-lg text-secondary capitalize'>
{post.title}
</span>
<span className='text-secondary'>{post.body}</span>
<h2>{post.id}</h2>
</li>
))}
</ul>
)}
</main>
</>
);
}
app\infinite-loading\page.tsx
//app\infinite-loading\page.tsx
"use client";
import useSWRInfinite from 'swr/infinite';
const fetcher = (url) => fetch(url).then((res) => res.json());
const getKey = (pageIndex, previousPageData) => {
if (pageIndex && !previousPageData.length) return null;
return `https://jsonplaceholder.typicode.com/posts?_page=${pageIndex}&_limit=6`;
};
export default function Home() {
const { data, size, setSize, isLoading } = useSWRInfinite(getKey, fetcher);
return (
<div className="max-w-7xl flex flex-col gap-10 mx-auto p-10">
<div className="flex justify-between items-center">
<h1 className="text-4xl font-bold">Nextjs Data fetching using SWR</h1>
</div>
<header className='p-7 text-center'>
<h1 className='text-secondary font-bold text-xl'>Infinite Loading</h1>
</header>
<main className='max-w-[1100px] mx-auto mt-10 pb-10 px-4'>
{isLoading ? (
<p className='text-secondary'>Loading posts</p>
) : (
<ul className='grid grid-cols-3 gap-x-3 gap-y-3'>
{data.map((posts) => {
return posts.map((post, index) => (
<li
className='bg-primary p-10 rounded-lg shadow-md border border-gray-200'
key={index}
>
<span className='block mb-4 font-bold text-lg text-secondary capitalize'>
{post.title}
</span>
<span className='text-secondary'>{post.body}</span>
</li>
));
})}
</ul>
)}
<div className='max-w-[600px] mx-auto my-10 flex justify-center'>
<button
className="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
onClick={() => setSize(size + 1)}
>
Load more
</button>
</div>
</main>
</div>
);
}
app\prevnext-pagination\page.tsx
//app\prevnext-pagination\page.tsx
"use client";
import { useState } from 'react';
import useSWR from 'swr';
const fetcher = (url) => fetch(url).then((res) => res.json());
const Page = ({ pageIndex }) => {
const { data: posts, isLoading } = useSWR(
`https://jsonplaceholder.typicode.com/posts?_page=${pageIndex}&_limit=6`,
fetcher
);
return (
isLoading ? (
<p className='text-secondary'>Loading posts</p>
) : (
<ul className='grid grid-cols-3 gap-x-3 gap-y-3'>
{posts.map((post, index) => (
<li className='bg-primary p-10 rounded-lg shadow-md border border-gray-200' key={index}>
<span className='block mb-4 font-bold text-lg text-secondary capitalize'>
{post.title}
</span>
<span className='text-secondary'>{post.body}</span>
<h2>{post.id}</h2>
</li>
))}
</ul>
)
)
}
export default function Home() {
const [pageIndex, setPageIndex] = useState(1);
return (
<div className="max-w-7xl flex flex-col gap-10 mx-auto p-10">
<div className="flex justify-between items-center">
<h1 className="text-4xl font-bold">Nextjs Data fetching using SWR</h1>
</div>
<header className="p-7 text-center">
<h1 className="text-secondary font-bold text-xl">Next Prev Pagination</h1>
</header>
<main className="max-w-[1100px] mx-auto mt-10 pb-10 px-4">
<Page pageIndex={pageIndex} />
<div className="hidden">
<Page pageIndex={pageIndex + 1} />
</div>
<div className="max-w-[600px] mx-auto my-10 grid grid-cols-2 gap-x-3">
<button
className="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
onClick={() => setPageIndex((_currentPage) => _currentPage - 1)}
>
Prev
</button>
<button
className="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800"
onClick={() => setPageIndex((_currentPage) => _currentPage + 1)}
>
Next
</button>
</div>
</main>
</div>
);
}
run C:\nextjs>npm run dev 