Guia resumido de Next.js
Aviso: os códigos foram feitos com a ajuda do GPT, mas foram revisados e alterados por Romm-0, além disso essa é uma documentação feita sem o front concluído e foi feita apenas para uma orientação geral do que fazer, com o decorrer do projeto ela pode sofrer alterações.
Sumário
1. Estrutura de pastas
- Aqui temos uma estrutura genérica para facilitar a visualização
/é-fake
├─ /pages # Onde ficam as páginas e rotas do Next.js
│ ├─ index.js # Página inicial
│ ├─ noticias.js # Pesquisa avançada
│ ├─ _app.js # App global (Tailwind, context)
│ └─ api/search.js # Endpoint interno
├─ /components # Componentes reutilizáveis (os nomes são autoexplicativos)
│ ├─ Layout.js
│ ├─ SearchBar.js
│ ├─ Results.js
│ └─ Card.js
├─ /styles
│ └─ globals.css
└─ tailwind.config.js
2. Página inicial e rotas
-
/pages/index.js
– É a página inicial do site -
Nesse exemplo o Next.js cria rotas automaticamente com base no nome dos arquivos em
/pages
.
Exemplo:
import Layout from "../components/Layout";
import SearchBar from "../components/SearchBar";
import Results from "../components/Results";
import { useState } from "react";
export default function Home() {
const [query, setQuery] = useState("");
return (
<Layout>
<SearchBar query={query} setQuery={setQuery} />
<Results query={query} />
</Layout>
);
}
3. Página dinâmica [id].js
(detalhes da notícia)
-
router.isFallback
- Mostra loading enquanto a página não está pronta -
getStaticProps
- Busca dados da API para a página -
getStaticPaths
- Define quais páginas dinâmicas gerar -
O exemplo a seguir mostra como criar páginas dinâmicas para cada notícia sem precisar criar manualmente cada arquivo.
Exemplo:
import { useRouter } from "next/router";
import Layout from "../../components/Layout";
export default function NewsDetail({ news }) {
const router = useRouter();
if (router.isFallback) return <div>Carregando...</div>;
return (
<Layout>
<h1>{news.title}</h1>
<p>{news.content}</p>
<span>{news.status}</span>
</Layout>
);
}
export async function getStaticProps({ params }) {
const res = await fetch(`http://localhost:3000/api/news/${params.id}`);
const news = await res.json();
return { props: { news } };
}
export async function getStaticPaths() {
return { paths: [], fallback: true };
}
4. API interna (/pages/api/search.js
)
-
Recebe query via
req.query.q
-
Filtra e retorna resultados JSON
-
Simula backend sem precisar de servidor externo
-
Facilita testes e integração com frontend Next.js de forma simples.
Exemplo:
import Card from "./Card";
export default function handler(req, res) {
const q = req.query.q?.toLowerCase() || "";
const allNews = [
{ id: 1, title: "Exemplo falso", status: "falso" },
{ id: 2, title: "Exemplo verdadeiro", status: "verdadeiro" },
{ id: 3, title: "Exemplo de meia verdade", status: "meia_verdade" },
{ id: 4, title: "Exemplo duvidoso", status: "duvidoso" },
];
res.status(200).json(allNews.filter(n => n.title.toLowerCase().includes(q)));
}
5. Componentes principais
-
SearchBar - Uma barra para pesquisas
-
Card - Exibe título e status da notícia
-
Results - Lista de cards, recebe query e faz fetch da API (vulgo pesquisa e mostra o que pedir)
-
O exemplo a seguir mostra as três funcionalidades acima
Exemplo:
// SearchBar.js
export default ({ query, setQuery }) => (
<input value={query} onChange={e => setQuery(e.target.value)} placeholder="Pesquisar..." />
);
// Card.js
export default ({ title, status }) => <div>{title} - {status}</div>;
// Results.js
import { useFetch } from "../hooks/useFetch";
export default ({ query }) => {
const data = useFetch(`/api/search?q=${query}`);
return data.map(n => <Card key={n.id} {...n} />);
};
6. Hook customizado
import { useState, useEffect } from "react";
export function useFetch(url) {
const [data, setData] = useState([]);
useEffect(() => { if(url) fetch(url).then(r => r.json()).then(setData); }, [url]);
return data;
}
7. Resumo do fluxo
-
Usuário digita no SearchBar -
Results
mostra cards -
Clique em card -
noticias/[id]
mostra detalhes -
Backend simulado via
/api/search.js
-
Componentes e hook mantêm código limpo e reutilizável (não só é importante para uso geral como também para a nota, prestem atenção nisso)