NextJS:ServerActions
Form 상태 관리, 캐싱, 유효성검사 관련하여 next에서 새롭게 제시하는 solution입니다.
Form 데이터로 서버의 데이터를 변경하고, 중간 API 레이어 없이 서버에서 동작하는 함수를 클라이언트에서 직접 실행시킬 수 있습니다.
Features
- revalidatePath() or revalidateTag()로 캐시된 데이터 재검증
- redirect()로 다른 route로 이동
- cookies() 로 쿠키 set & read
- useOptimistic()로 optimistic UI 핸들링
- useFormState() 로 서버에서 발생한 에러 핸들링
- useFormStatus() 로딩상태 표시
How use it
form의 action 사용하기
import db from './db'
import { redirect } from 'next/navigation'
async function create(formData: FormData){
'use serevr'
const post = await db.post.insert({
title: formData.get('title'),
content: formData.get('content'),
})
redirect(`/blog/${post.slug}`)
}
export default function Page(){
return (
<form action={create}>
<input type="text" name="title" />
<textarea name="content" />
<button type="submit">Submit</button>
</form>
)
}
formAction 사용하기
export default function Page() {
async function handleSubmit() {
'use server';
// ...
}
async function submitImage() {
'use server';
// ...
}
return (
<form action={handleSubmit}>
<input type="text" name="name" />
<input type="image" formAction={submitImage} />
<button type="submit">Submit</button>
</form>
);
}
React의 startTransition 사용하기
client component에서 server action을 호출하는 방법
app/actions.js
file:
'use server'; // client-component 파일에서 server action 직접 정의할 수 없기 때문에, 따로 파일을 만들어야합니다.
export async function addItem(id) {
await addItemToDb(id);
revalidatePath(`/product/${id}`);
}
app/components/example-client-component.js
file:
'use client';
import { useTransition } from 'react';
import { addItem } from '../actions';
function ExampleClientComponent({ id }) {
let [isPending, startTransition] = useTransition();
return (
<button onClick={() => startTransition(() => addItem(id))}>
Add To Cart
</button>
);
}
Fetching Data on the Server with fetch
useFormStatus
APIs
revalidatePath
revalidateTag
See also
Favorite site
- (nextjs) Server Action
- Next.js 13.4 Server Actions에 대해서 ("use server")
- Next.js의 Server actions 기능 - 코딩애플 온라인 강좌
- Next.js 서버 액션 알아보기 | Yujiseok