Next.js 使用例子
通过实际代码示例学习 Next.js 的核心功能
📄 1. 基础页面组件
创建一个简单的页面组件,展示基本的 Next.js 页面结构。
// app/page.tsx
export default function HomePage() {
return (
<div className="container mx-auto px-4 py-8">
<h1 className="text-3xl font-bold mb-4">
欢迎来到我的 Next.js 应用
</h1>
<p className="text-gray-600">
这是一个使用 Next.js 构建的页面。
</p>
</div>
);
}🔗 2. 动态路由
使用动态路由创建可复用的页面,支持参数传递。
// app/posts/[id]/page.tsx
interface PostPageProps {
params: {
id: string;
};
}
export default function PostPage({ params }: PostPageProps) {
return (
<div className="container mx-auto px-4 py-8">
<h1 className="text-2xl font-bold mb-4">
文章 ID: {params.id}
</h1>
<p className="text-gray-600">
这是文章 {params.id} 的详细内容。
</p>
</div>
);
}📊 3. 数据获取
在服务器端获取数据并渲染页面。
// app/users/page.tsx
interface User {
id: number;
name: string;
email: string;
}
async function getUsers(): Promise<User[]> {
const res = await fetch('https://jsonplaceholder.typicode.com/users');
return res.json();
}
export default async function UsersPage() {
const users = await getUsers();
return (
<div className="container mx-auto px-4 py-8">
<h1 className="text-2xl font-bold mb-6">用户列表</h1>
<div className="grid gap-4">
{users.map((user) => (
<div key={user.id} className="p-4 border rounded-lg">
<h3 className="font-semibold">{user.name}</h3>
<p className="text-gray-600">{user.email}</p>
</div>
))}
</div>
</div>
);
}🔌 4. API 路由
创建后端 API 端点处理请求。
// app/api/users/route.ts
import { NextResponse } from 'next/server';
export async function GET() {
const users = [
{ id: 1, name: '张三', email: 'zhang@example.com' },
{ id: 2, name: '李四', email: 'li@example.com' },
];
return NextResponse.json(users);
}
export async function POST(request: Request) {
const body = await request.json();
// 处理创建用户的逻辑
const newUser = {
id: Date.now(),
name: body.name,
email: body.email,
};
return NextResponse.json(newUser, { status: 201 });
}🎯 5. 客户端组件
使用客户端组件处理交互和状态管理。
// app/components/Counter.tsx
'use client';
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return (
<div className="text-center p-6 border rounded-lg">
<h3 className="text-xl font-semibold mb-4">计数器</h3>
<p className="text-2xl font-bold mb-4">{count}</p>
<div className="space-x-4">
<button
onClick={() => setCount(count - 1)}
className="px-4 py-2 bg-red-500 text-white rounded hover:bg-red-600"
>
减少
</button>
<button
onClick={() => setCount(count + 1)}
className="px-4 py-2 bg-green-500 text-white rounded hover:bg-green-600"
>
增加
</button>
</div>
</div>
);
}🏗️ 6. 布局组件
创建可复用的布局组件。
// app/components/Layout.tsx
import Link from 'next/link';
interface LayoutProps {
children: React.ReactNode;
}
export default function Layout({ children }: LayoutProps) {
return (
<div className="min-h-screen">
<nav className="bg-gray-800 text-white p-4">
<div className="container mx-auto flex justify-between items-center">
<Link href="/" className="text-xl font-bold">
我的应用
</Link>
<div className="space-x-4">
<Link href="/" className="hover:text-gray-300">
首页
</Link>
<Link href="/about" className="hover:text-gray-300">
关于
</Link>
<Link href="/examples" className="hover:text-gray-300">
例子
</Link>
</div>
</div>
</nav>
<main className="container mx-auto px-4 py-8">
{children}
</main>
<footer className="bg-gray-800 text-white p-4 text-center">
© 2024 我的 Next.js 应用
</footer>
</div>
);
}🖼️ 7. 图片优化
使用 Next.js 的图片组件进行自动优化。
// app/components/ImageGallery.tsx
import Image from 'next/image';
const images = [
{ src: '/image1.jpg', alt: '风景图片 1' },
{ src: '/image2.jpg', alt: '风景图片 2' },
{ src: '/image3.jpg', alt: '风景图片 3' },
];
export default function ImageGallery() {
return (
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
{images.map((image, index) => (
<div key={index} className="relative h-64">
<Image
src={image.src}
alt={image.alt}
fill
className="object-cover rounded-lg"
sizes="(max-width: 768px) 100vw, 33vw"
/>
</div>
))}
</div>
);
}📝 8. 表单处理
处理表单提交和数据验证。
// app/components/ContactForm.tsx
'use client';
import { useState } from 'react';
export default function ContactForm() {
const [formData, setFormData] = useState({
name: '',
email: '',
message: '',
});
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
try {
const response = await fetch('/api/contact', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(formData),
});
if (response.ok) {
alert('消息发送成功!');
setFormData({ name: '', email: '', message: '' });
}
} catch (error) {
alert('发送失败,请重试。');
}
};
return (
<form onSubmit={handleSubmit} className="space-y-4">
<div>
<label className="block text-sm font-medium mb-1">姓名</label>
<input
type="text"
value={formData.name}
onChange={(e) => setFormData({...formData, name: e.target.value})}
className="w-full p-2 border rounded"
required
/>
</div>
<div>
<label className="block text-sm font-medium mb-1">邮箱</label>
<input
type="email"
value={formData.email}
onChange={(e) => setFormData({...formData, email: e.target.value})}
className="w-full p-2 border rounded"
required
/>
</div>
<div>
<label className="block text-sm font-medium mb-1">消息</label>
<textarea
value={formData.message}
onChange={(e) => setFormData({...formData, message: e.target.value})}
className="w-full p-2 border rounded"
rows={4}
required
/>
</div>
<button
type="submit"
className="w-full bg-blue-500 text-white py-2 rounded hover:bg-blue-600"
>
发送消息
</button>
</form>
);
}💡 实践建议
最佳实践
- 使用 TypeScript 提供类型安全
- 合理使用服务端和客户端组件
- 优化图片和字体加载
- 实现错误边界和加载状态
性能优化
- 使用静态生成提高加载速度
- 实现代码分割减少包大小
- 缓存 API 响应数据
- 使用 CDN 加速静态资源