Next.js

👋 FYI, this note is over 6 months old. Some of the content may be out of date.
On this page

Pages Jump to heading

_app.tsx Jump to heading

import { AppProps } from 'next/app'
import React from 'react'
import { ThemeProvider } from 'theme-ui'
import { theme } from '../theme'

const App = ({ Component, pageProps }: AppProps) => {
return (
<ThemeProvider theme={theme}>
<Component {...pageProps} />
</ThemeProvider>
)
}

export default App

Data fetching Jump to heading

getStaticProps Jump to heading

(Static Generation): Fetch data at build time.

If you export an async function called getStaticProps from a page, Next.js will pre-render this page at build time using the props returned by getStaticProps.

import { GetStaticProps } from 'next'

export const getStaticProps: GetStaticProps = async (context) => {
const res = await fetch(`https://...`)
const data = await res.json()

if (!data) {
return {
// return a 404
// notFound: true,

// or redirect to another page
redirect: {
destination: '/',
permanent: false,
},
}
}

return {
props: {}, // will be passed to the page component as props
}
}

getStaticPaths Jump to heading

(Static Generation): Specify dynamic routes to pre-render pages based on data.

If a page has dynamic routes (documentation) and uses getStaticProps it needs to define a list of paths that have to be rendered to HTML at build time.

The paths key determines which paths will be pre-rendered. For example, suppose that you have a page that uses dynamic routes named pages/posts/[id].js. If you export getStaticPaths from this page and return the following for paths:

import { GetStaticPaths } from 'next'

export const getStaticPaths: GetStaticPaths = async () => {
return {
paths: [
{
params: { id: '1' },
},
{
params: { id: '2' },
},
],
fallback: true, // or false // See the "fallback" section below
}
}

Then Next.js will statically generate posts/1 and posts/2 at build time using the page component in pages/posts/[id].js.

getServerSideProps Jump to heading

(Server-side Rendering)

If you export an async function called getServerSideProps from a page, Next.js will pre-render this page on each request using the data returned by getServerSideProps.

import { GetServerSideProps } from 'next'

export const getServerSideProps: GetServerSideProps = async (context) => {
const res = await fetch(`https://...`)
const data = await res.json()

if (!data) {
return {
// return a 404
// notFound: true,

// or redirect to another page
redirect: {
destination: '/',
permanent: false,
},
}
}

return {
props: {}, // will be passed to the page component as props
}
}

APIs Jump to heading

next/router Jump to heading

useRouter Jump to heading

import { useRouter } from 'next/router'

export default function Page() {
const router = useRouter()
return <button onClick={() => router.push('/about')}>Click me</button>
}

← Back home