正在加载,请稍候…

Next.js 15 服务器操作:数据变更、表单与乐观更新

掌握 Next.js 15 服务器操作——无需 API 路由即可处理数据变更,使用 useActionState、useOptimistic 实现渐进增强。

Next.js 15 服务器操作:数据变更、表单与乐观更新

服务器操作:无需 API 路由即可处理数据变更

// app/actions.ts
'use server'
export async function createPost(formData: FormData) {
  const session = await auth()
  if (!session?.user) throw new Error('Unauthorized')

  const title = formData.get('title') as string
  if (!title || title.length < 3) return { error: 'Title too short' }

  await db.post.create({ data: { title, authorId: session.user.id } })
  revalidatePath('/posts')
  redirect('/posts')
}

Next.js 15 服务器操作:数据变更、表单与乐观更新 插图

渐进增强(无需 JavaScript 即可工作)

export default function NewPostPage() {
  return (
    <form action={createPost}>
      <input name="title" required />
      <button type="submit">Create</button>
    </form>
  )
}

Next.js 15 服务器操作:数据变更、表单与乐观更新 插图

useActionState

'use client'
export function PostForm() {
  const [state, formAction, isPending] = useActionState(createPost, {})
  return (
    <form action={formAction}>
      {state?.error && <p>{state.error}</p>}
      <input name="title" />
      <button disabled={isPending}>{isPending ? 'Saving...' : 'Create'}</button>
    </form>
  )
}

Next.js 15 服务器操作:数据变更、表单与乐观更新 插图

useOptimistic

'use client'
export function LikeButton({ post }) {
  const [optimistic, addOptimistic] = useOptimistic(post.liked, (s) => !s)
  async function like() { addOptimistic(null); await toggleLike(post.id) }
  return <button onClick={like}>{optimistic ? 'Liked' : 'Like'}</button>
}

-> 使用 Base64 转换器 编码表单数据。