为什么需要 Server Actions?
在传统的 React 全栈开发中,我们通常需要:
- 创建一个 API 路由(如
/api/submit) - 在前端用
fetch调用该接口 - 手动处理 loading、错误和重新验证
这种模式代码分散、样板代码多,且容易遗漏加载状态。React Server Actions(以下简称 Server Actions)允许你在组件中直接定义异步服务端函数,并通过表单或事件调用它们,从而简化数据变更流程。
Server Actions 是 React 19 的稳定特性,Next.js 13.4+ 已内置支持。本文将基于 Next.js 14(App Router)进行演示,但核心概念同样适用于其他支持 React Server Components 的框架。
环境准备
确保你已安装 Node.js 18.17 或更高版本。创建一个新的 Next.js 项目:
npx create-next-app@latest server-actions-demo --typescript --app --tailwind --eslint
cd server-actions-demo
安装必要依赖(本文会用到 zod 做数据验证):
npm install zod
启动开发服务器:
npm run dev
第一步:定义一个最简单的 Server Action
在 app/actions.ts 中创建一个 Server Action:
// app/actions.ts
'use server';
export async function greet(name: string) {
// 模拟异步操作
await new Promise((resolve) => setTimeout(resolve, 500));
return `你好,${name}!`;
}
'use server' 指令告诉 React 这个模块中的所有导出函数都是 Server Actions,它们只能在服务端执行。
在客户端组件中调用它:
// app/components/GreetForm.tsx
'use client';
import { useState } from 'react';
import { greet } from '../actions';
export default function GreetForm() {
const [message, setMessage] = useState('');
async function handleSubmit(formData: FormData) {
const name = formData.get('name') as string;
const result = await greet(name);
setMessage(result);
}
return (
<form action={handleSubmit}>
<input name="name" placeholder="输入你的名字" required />
<button type="submit">打招呼</button>
{message && <p>{message}</p>}
</form>
);
}
注意: