Next.js 15:我才知道居然還有這個組件!
說實話,我之前根本不知道這個組件的存在,直到偶然看到了 Vercel 團隊的一段 YouTube 視頻。視頻里展示了他們自家的 AI 服務——V0,在配合 Next.js 15 使用時甚至比 ChatGPT 和 Claude 都更好玩。更有趣的是,視頻中特別提到了一個 Next.js 新增的組件 <Form>,一試之后發現真的非常實用!
今天,我們就一起來探索一下這個有趣的新組件。
什么是 Next.js 的 <Form> 組件?
Next.js 15 引入的 <Form> 組件擴展了傳統的 HTML <form> 元素,提供了一些額外強大的特性:
- 客戶端導航:提交表單后頁面不會完全刷新,體驗更順滑。
- 預加載(Prefetch):自動預加載共享的 UI 組件(如 layout.js 和 loading.js),進一步提高導航速度。
- 漸進式增強(Progressive enhancement):顯著降低處理 URL 參數的復雜性。
這種特性對于經常與 URL 查詢參數交互或者需要進行服務端操作的應用場景非常實用。
基本使用方法
下面是一個簡單的搜索表單使用示例:
import Form from 'next/form';
export default function SearchPage() {
return (
<Form action="/search">
<input name="query" placeholder="搜索關鍵詞"/>
<button type="submit">搜索</button>
</Form>
);
}
當用戶提交表單時,輸入的內容會自動拼接到 URL 中作為查詢參數,比如:/search?query=abc。并且,這一過程完全是客戶端導航完成的,不需要重新加載頁面,用戶體驗更加流暢。
深入理解 <Form> 工作原理
<Form> 組件具體表現取決于 action 屬性的類型:
1. action 為字符串
- 類似于傳統 HTML 表單的 GET 方法。
- 表單數據會轉為 URL 查詢參數。
- 自動進行 UI 組件預加載,提升導航性能。
- 使用客戶端導航,避免頁面刷新,保留狀態。
圖片
例如:
<Form actinotallow="/products">
<input name="category" placeholder="類別"/>
<button type="submit">查詢</button>
</Form>
2. action 為函數(Server Action)
- 表單提交時會調用服務端操作(Server Action)。
- 適合用來創建、修改或刪除服務器上的資源。
圖片
import Form from 'next/form';
import { createUser } from '@/actions';
export default function CreateUserForm() {
return (
<Form action={createUser}>
<input name="username" placeholder="用戶名"/>
<button type="submit">創建用戶</button>
</Form>
);
}
進階特性
預加載(Prefetch)
當表單元素進入視口時,Next.js 自動預加載目標頁面的共享 UI。這種機制能讓頁面跳轉更加快速平滑。
加載狀態(Loading State)
你還可以通過 useFormStatus 鉤子,輕松實現表單提交時的加載反饋:
'use client';
import { useFormStatus } from 'react-dom';
export default function SubmitButton() {
const status = useFormStatus();
return (
<button type="submit">
{status.pending ? '提交中...' : '提交'}
</button>
);
}
常見使用場景
搜索表單
一個典型的場景就是快速實現搜索功能:
import Form from 'next/form';
export default function Search() {
return (
<Form action="/results">
<input name="keyword" placeholder="搜索關鍵字"/>
<button type="submit">搜索</button>
</Form>
);
}
在結果頁中,可以通過 props 訪問 URL 中的搜索參數:
export default async function SearchResults({ searchParams }) {
const data = await fetchSearchResults(searchParams.keyword);
return <div>{/* 渲染搜索結果 */}</div>;
}
服務端數據變更
配合服務端操作(Server Actions),比如創建新文章:
import Form from 'next/form';
import { createArticle } from '@/actions';
export default function CreateArticlePage() {
return (
<Form action={createArticle}>
<input name="title" placeholder="標題"/>
<button type="submit">發布</button>
</Form>
);
}
對應的服務端函數可以完成創建并跳轉頁面:
'use server';
import { redirect } from 'next/navigation';
export async function createArticle(formData) {
const article = await saveArticleToDatabase(formData);
redirect(`/articles/${article.id}`);
}
為什么你應該試試 <Form>?
前端開發日新月異,尤其是 Next.js,每個版本都在迅速迭代,我們開發者更要不斷學習。而 Next.js 15 引入的 <Form> 組件顯然是個令人興奮的新特性:
- 減少了重復編寫表單提交代碼的工作量。
- 提供了預加載、客戶端導航等高級功能。
- 特別適用于常見的搜索功能和服務端數據變更場景。
即使你熟悉 React 和 Next.js,也強烈推薦嘗試一下這個新組件。也許它會徹底改變你的開發方式呢!