μλ² μ‘μ μΌλ‘ νΈλ¦¬κ±°λλ μν μ λ°μ΄νΈλ₯Ό κ΄λ¦¬νκΈ° μν Reactμ useActionState ν μ μ΄ν΄λ³΄κ³ , μ΅μ React μ ν리μΌμ΄μ μμ μ¬μ©μ κ²½νκ³Ό λ°μ΄ν° μ²λ¦¬λ₯Ό ν₯μμν€μΈμ.
React useActionState: μλ² μ‘μ μ μν μ λ°μ΄νΈ κ°μν
Reactμμ μλ² μ‘μ
μ λμ
μ React μ ν리μΌμ΄μ
λ΄μμ λ°μ΄ν° λ³νκ³Ό μνΈ μμ©μ μ²λ¦¬νλ λ°©μμ μμ΄ μ€μν μ§νλ₯Ό λνλ
λλ€. useActionState
ν
μ μ΄λ¬ν ν¨λ¬λ€μ μ νμμ μ€μν μν μ νλ©°, μλ²μμ νΈλ¦¬κ±°λ μ‘μ
μ μνλ₯Ό κ΄λ¦¬νλ κΉ¨λνκ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€. μ΄ κΈ°μ¬μμλ useActionState
μ 볡μ‘μ±μ νκ³ λ€μ΄ λͺ©μ , μ΄μ , μ€μ©μ μΈ μμ© νλ‘κ·Έλ¨, κ·Έλ¦¬κ³ λ κ°μνλκ³ λ°μμ μΈ μ¬μ©μ κ²½νμ κΈ°μ¬νλ λ°©μμ μ΄ν΄λ΄
λλ€.
Reactμμ μλ² μ‘μ μ΄ν΄νκΈ°
useActionState
λ₯Ό μμΈν μ΄ν΄λ³΄κΈ° μ μ μλ² μ‘μ
μ κ°λ
μ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. μλ² μ‘μ
μ μλ²μμ μ§μ μ€νλλ λΉλκΈ° ν¨μλ‘, κ°λ°μκ° λ³λμ API κ³μΈ΅ μμ΄ λ°μ΄ν° λ³ν(μ: λ°μ΄ν° μμ±, μ
λ°μ΄νΈ λλ μμ )μ μνν μ μλλ‘ ν©λλ€. μ΄λ₯Ό ν΅ν΄ κΈ°μ‘΄ ν΄λΌμ΄μΈνΈ μΈ‘ λ°μ΄ν° κ°μ Έμ€κΈ° λ° μ‘°μκ³Ό κ΄λ ¨λ μμ©κ΅¬ μ½λλ₯Ό μ κ±°νμ¬ λ κΉ¨λνκ³ μ μ§ κ΄λ¦¬κ° μ©μ΄ν μ½λλ² μ΄μ€λ₯Ό ꡬμΆν μ μμ΅λλ€.
μλ² μ‘μ μ λ€μκ³Ό κ°μ λͺ κ°μ§ μ΄μ μ μ 곡ν©λλ€.
- ν΄λΌμ΄μΈνΈ μΈ‘ μ½λ κ°μ: λ°μ΄ν° λ³νμ λν λ‘μ§μ μλ²μ μ‘΄μ¬νμ¬ ν΄λΌμ΄μΈνΈμμ νμν JavaScriptμ μμ μ΅μνν©λλ€.
- 보μ ν₯μ: μλ² μΈ‘ μ€νμ λ―Όκ°ν λ°μ΄ν° λλ λ‘μ§μ΄ ν΄λΌμ΄μΈνΈμ λ ΈμΆλ μνμ μ€μ λλ€.
- μ±λ₯ ν₯μ: λΆνμν λ€νΈμν¬ μμ²κ³Ό λ°μ΄ν° μ§λ ¬ν/μμ§λ ¬νλ₯Ό μ κ±°νλ©΄ λ λΉ λ₯Έ μλ΅ μκ°μ μ»μ μ μμ΅λλ€.
- κ°λ° κ°μν: API μλν¬μΈνΈ λ° ν΄λΌμ΄μΈνΈ μΈ‘ λ°μ΄ν° κ°μ Έμ€κΈ° λ‘μ§μ κ΄λ¦¬ν νμκ° μμΌλ―λ‘ κ°λ° νλ‘μΈμ€κ° κ°μνλ©λλ€.
useActionState μκ°: μ‘μ μν ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νκΈ°
useActionState
ν
μ μλ² μ‘μ
μΌλ‘ μΈν΄ λ°μνλ μν μ
λ°μ΄νΈ κ΄λ¦¬λ₯Ό λ¨μννλλ‘ μ€κ³λμμ΅λλ€. μ‘μ
μ 보λ₯ μ€μΈ μνλ₯Ό μΆμ νκ³ , λ‘λ© νμκΈ°λ₯Ό νμνκ³ , μ€λ₯λ₯Ό μ²λ¦¬νκ³ , κ·Έμ λ°λΌ UIλ₯Ό μ
λ°μ΄νΈνλ λ°©λ²μ μ 곡ν©λλ€. μ΄ ν
μ μλ² μΈ‘ μμ
μ μ§ν μν©μ λν λͺ
νν νΌλλ°±μ μ 곡νμ¬ μ¬μ©μ κ²½νμ ν₯μμν΅λλ€.
useActionStateμ κΈ°λ³Έ μ¬μ©λ²
useActionState
ν
μ λ κ°μ μΈμλ₯Ό λ°μ΅λλ€.
- μ‘μ : μ€νλ μλ² μ‘μ ν¨μμ λλ€.
- μ΄κΈ° μν: μ‘μ μ μν΄ μ λ°μ΄νΈλ μνμ μ΄κΈ° κ°μ λλ€.
λ€μμ΄ ν¬ν¨λ λ°°μ΄μ λ°νν©λλ€.
- μ λ°μ΄νΈλ μν: μ‘μ μ΄ μλ£λ ν μ λ°μ΄νΈλλ μνμ νμ¬ κ°μ λλ€.
- μ‘μ νΈλ€λ¬: μλ² μ‘μ μ νΈλ¦¬κ±°νκ³ κ·Έμ λ°λΌ μνλ₯Ό μ λ°μ΄νΈνλ ν¨μμ λλ€.
λ€μμ κ°λ¨ν μμ λλ€.
import { useActionState } from 'react';
import { updateProfile } from './actions'; // updateProfileμ΄ μλ² μ‘μ
μ΄λΌκ³ κ°μ
function ProfileForm() {
const [state, dispatch] = useActionState(updateProfile, { success: false, error: null });
const handleSubmit = async (formData) => {
await dispatch(formData);
};
return (
);
}
μ΄ μμ μμ useActionState
λ updateProfile
μλ² μ‘μ
μ μνλ₯Ό κ΄λ¦¬ν©λλ€. handleSubmit
ν¨μλ dispatch
ν¨μλ₯Ό μ¬μ©νμ¬ μ‘μ
μ νΈλ¦¬κ±°ν©λλ€. state
κ°μ²΄λ μ‘μ
μ μ§ν μν©μ λν μ 보λ₯Ό μ 곡νλ©°, 보λ₯ μ€μΈμ§, μ€λ₯κ° λ°μνλμ§, λλ μ±κ³΅μ μΌλ‘ μλ£λμλμ§ μ¬λΆλ₯Ό ν¬ν¨ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μμκ² μ μ ν νΌλλ°±μ νμν μ μμ΅λλ€.
κ³ κΈ useActionState μλ리μ€
useActionState
μ κΈ°λ³Έ μ¬μ©λ²μ κ°λ¨νμ§λ§, μν κ΄λ¦¬ λ° μ¬μ©μ κ²½νμ λ€μν μΈ‘λ©΄μ μ²λ¦¬νκΈ° μν΄ λ 볡μ‘ν μλ리μ€μ μ μ©ν μ μμ΅λλ€.
μ€λ₯ λ° λ‘λ© μν μ²λ¦¬
useActionState
μ μ£Όμ μ΄μ μ€ νλλ μ€λ₯ λ° λ‘λ© μνλ₯Ό μννκ² μ²λ¦¬ν μ μλ€λ κ²μ
λλ€. μ‘μ
μ 보λ₯ μ€μΈ μνλ₯Ό μΆμ νμ¬ μ‘μ
μ΄ μ§ν μ€μμ μ¬μ©μμκ² μ리기 μν΄ λ‘λ© νμκΈ°λ₯Ό νμν μ μμ΅λλ€. λ§μ°¬κ°μ§λ‘, μ‘μ
μμ λ°μν μ€λ₯λ₯Ό ν¬μ°©νκ³ μ¬μ©μμκ² μ€λ₯ λ©μμ§λ₯Ό νμν μ μμ΅λλ€.
import { useActionState } from 'react';
import { createUser } from './actions';
function RegistrationForm() {
const [state, dispatch] = useActionState(createUser, { pending: false, error: null, success: false });
const handleSubmit = async (formData) => {
await dispatch(formData);
};
return (
);
}
μ΄ μμ μμ state
κ°μ²΄μλ pending
, error
λ° success
μμ±μ΄ ν¬ν¨λμ΄ μμ΅λλ€. pending
μμ±μ μ‘μ
μ΄ μ§ν μ€μΌ λ μ μΆ λ²νΌμ λΉνμ±ννκ³ λ‘λ© νμκΈ°λ₯Ό νμνλ λ° μ¬μ©λ©λλ€. error
μμ±μ μ‘μ
μ΄ μ€ν¨ν κ²½μ° μ€λ₯ λ©μμ§λ₯Ό νμνλ λ° μ¬μ©λ©λλ€. success
μμ±μ νμΈ λ©μμ§λ₯Ό νμν©λλ€.
UI λκ΄μ μΌλ‘ μ λ°μ΄νΈνκΈ°
λκ΄μ μ λ°μ΄νΈμλ μλ²κ° μ λ°μ΄νΈλ₯Ό νμΈνκΈ°λ₯Ό κΈ°λ€λ¦¬λ λμ μ‘μ μ΄ μ±κ³΅ν κ²μ²λΌ μ¦μ UIλ₯Ό μ λ°μ΄νΈνλ κ²μ΄ ν¬ν¨λ©λλ€. μ΄λ μ ν리μΌμ΄μ μ μ²΄κ° μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
useActionState
λ λκ΄μ μ
λ°μ΄νΈλ₯Ό μ§μ μ μΌλ‘ μ©μ΄νκ² νμ§ μμ§λ§, μ΄ ν¨κ³Όλ₯Ό μ»κΈ° μν΄ λ€λ₯Έ κΈ°μ κ³Ό κ²°ν©ν μ μμ΅λλ€. ν κ°μ§ λ°©λ²μ μ‘μ
μ λμ€ν¨μΉνκΈ° μ μ λ‘컬μμ μνλ₯Ό μ
λ°μ΄νΈν λ€μ μ‘μ
μ΄ μ€ν¨ν κ²½μ° μ
λ°μ΄νΈλ₯Ό λλ리λ κ²μ
λλ€.
import { useActionState, useState } from 'react';
import { likePost } from './actions';
function Post({ post }) {
const [likes, setLikes] = useState(post.likes);
const [state, dispatch] = useActionState(likePost, { error: null });
const handleLike = async () => {
// λκ΄μ μΌλ‘ UI μ
λ°μ΄νΈ
setLikes(likes + 1);
const result = await dispatch(post.id);
if (result.error) {
// μ‘μ
μ΄ μ€ν¨νλ©΄ λκ΄μ μ
λ°μ΄νΈλ₯Ό λλ립λλ€.
setLikes(likes);
console.error('κ²μλ¬Ό μ’μμ μ€ν¨:', result.error);
}
};
return (
{post.content}
{state.error && {state.error}
}
);
}
μ΄ μμ μμ handleLike
ν¨μλ likePost
μ‘μ
μ λμ€ν¨μΉνκΈ° μ μ λκ΄μ μΌλ‘ likes
μΉ΄μ΄νΈλ₯Ό μ¦κ°μν΅λλ€. μ‘μ
μ΄ μ€ν¨νλ©΄ likes
μΉ΄μ΄νΈκ° μλ κ°μΌλ‘ λλμκ°λλ€.
μμ μ μΆ μ²λ¦¬
useActionState
λ μμ μ μΆμ μ²λ¦¬νλ λ° νΉν μ ν©ν©λλ€. μμμ μνλ₯Ό κ΄λ¦¬νκ³ , μ ν¨μ± κ²μ¬ μ€λ₯λ₯Ό νμνκ³ , μ¬μ©μμκ² νΌλλ°±μ μ 곡νλ κΉ¨λνκ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€.
import { useActionState } from 'react';
import { createComment } from './actions';
function CommentForm() {
const [state, dispatch] = useActionState(createComment, { pending: false, error: null, success: false });
const handleSubmit = async (event) => {
event.preventDefault();
const formData = new FormData(event.target);
await dispatch(formData);
};
return (
);
}
μ΄ μμ μμ handleSubmit
ν¨μλ κΈ°λ³Έ μμ μ μΆ λμμ λ°©μ§νκ³ μμ λ°μ΄ν°μμ FormData
κ°μ²΄λ₯Ό μμ±ν©λλ€. κ·Έλ° λ€μ createComment
μ‘μ
μ μμ λ°μ΄ν°μ ν¨κ» λμ€ν¨μΉν©λλ€. state
κ°μ²΄λ μ‘μ
μ΄ μ§ν μ€μΌ λ λ‘λ© νμκΈ°λ₯Ό νμνκ³ μ‘μ
μ΄ μ€ν¨ν κ²½μ° μ€λ₯ λ©μμ§λ₯Ό νμνλ λ° μ¬μ©λ©λλ€.
useActionStateμ λν λͺ¨λ² μ¬λ‘
useActionState
μ μ΄μ μ κ·Ήλννλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμμμ€.
- μ‘μ κ°κ²°νκ² μ μ§: μλ² μ‘μ μ λ¨μΌνκ³ μ μ μλ μμ μ μννλ λ° μ§μ€ν΄μΌ ν©λλ€. λ¨μΌ μ‘μ λ΄μ 볡μ‘ν λ‘μ§ λλ μ¬λ¬ μμ μ ν¬ν¨νμ§ λ§μμμ€.
- μ€λ₯λ₯Ό μ μ νκ² μ²λ¦¬: μκΈ°μΉ μμ μ€λ₯λ‘ μΈν΄ μ ν리μΌμ΄μ μ΄ μ€λ¨λμ§ μλλ‘ μλ² μ‘μ μμ κ°λ ₯ν μ€λ₯ μ²λ¦¬λ₯Ό ꡬνν©λλ€. μ¬μ©μμκ² λ¬΄μμ΄ μλͺ»λμλμ§ μ΄ν΄νλ λ° λμμ΄ λλ μ μ΅ν μ€λ₯ λ©μμ§λ₯Ό μ 곡ν©λλ€.
- μλ―Έ μλ μν μ¬μ©: μ‘μ μ μλ‘ λ€λ₯Έ μνλ₯Ό μ ννκ² λ°μνλλ‘ μν κ°μ²΄λ₯Ό μ€κ³ν©λλ€. 보λ₯ μ€, μ€λ₯, μ±κ³΅ λ° κΈ°ν κ΄λ ¨ μ 보μ λν μμ±μ ν¬ν¨ν©λλ€.
- λͺ
νν νΌλλ°± μ 곡:
useActionState
μμ μ 곡νλ μν μ 보λ₯Ό μ¬μ©νμ¬ μ¬μ©μμκ² λͺ ννκ³ μ μ΅ν νΌλλ°±μ μ 곡ν©λλ€. λ‘λ© νμκΈ°, μ€λ₯ λ©μμ§ λ° μ±κ³΅ λ©μμ§λ₯Ό νμνμ¬ μ‘μ μ μ§ν μν©μ λν΄ μ¬μ©μλ₯Ό κ³μ μλ €μ€λλ€. - μ κ·Όμ± κ³ λ €: μ₯μ κ° μλ μ¬μ©μκ° μ ν리μΌμ΄μ μ μ‘μΈμ€ν μ μλλ‘ ν©λλ€. ARIA μμ±μ μ¬μ©νμ¬ μ‘μ μ μνμ μν₯μ λ°λ UI μμμ λν μΆκ° μ 보λ₯Ό μ 곡ν©λλ€.
κ΅μ μ μΈ κ³ λ € μ¬ν
κΈλ‘λ² μ¬μ©μλ₯Ό μν΄ useActionState
λ‘ μ ν리μΌμ΄μ
μ κ°λ°ν λ κ΅μ ν λ° νμ§νλ₯Ό κ³ λ €νλ κ²μ΄ μ€μν©λλ€. λ€μμ λͺ κ°μ§ μ£Όμ κ³ λ € μ¬νμ
λλ€.
- λ μ§ λ° μκ° μμ: λ μ§μ μκ°μ΄ μ¬μ©μμ λ‘μΊμ λ°λΌ μμ μ§μ λμλμ§ νμΈν©λλ€. λ μ§ λ° μκ° μμμ μ¬λ°λ₯΄κ² μ²λ¦¬νλ €λ©΄ μ μ ν λΌμ΄λΈλ¬λ¦¬ λλ APIλ₯Ό μ¬μ©ν©λλ€.
- ν΅ν μμ: μ¬μ©μμ λ‘μΊμ λ°λΌ ν΅νλ₯Ό μμ μ§μ ν©λλ€. ν΅ν μμμ μ¬λ°λ₯΄κ² μ²λ¦¬νλ €λ©΄ μ μ ν λΌμ΄λΈλ¬λ¦¬ λλ APIλ₯Ό μ¬μ©ν©λλ€.
- μ«μ μμ: μ¬μ©μμ λ‘μΊμ λ°λΌ μ«μλ₯Ό μμ μ§μ ν©λλ€. μ«μ μμμ μ¬λ°λ₯΄κ² μ²λ¦¬νλ €λ©΄ μ μ ν λΌμ΄λΈλ¬λ¦¬ λλ APIλ₯Ό μ¬μ©ν©λλ€.
- ν
μ€νΈ λ°©ν₯: μΌμͺ½μμ μ€λ₯Έμͺ½(LTR) λ° μ€λ₯Έμͺ½μμ μΌμͺ½(RTL) ν
μ€νΈ λ°©ν₯μ λͺ¨λ μ§μν©λλ€.
direction
λ°unicode-bidi
μ κ°μ CSS μμ±μ μ¬μ©νμ¬ ν μ€νΈ λ°©ν₯μ μ¬λ°λ₯΄κ² μ²λ¦¬ν©λλ€. - μ€λ₯ λ©μμ§ νμ§ν: μ€λ₯ λ©μμ§λ₯Ό νμ§ννμ¬ μ¬μ©μκ° μ νΈνλ μΈμ΄λ‘ νμλλλ‘ ν©λλ€. νμ§ν λΌμ΄λΈλ¬λ¦¬ λλ APIλ₯Ό μ¬μ©νμ¬ λ²μμ κ΄λ¦¬ν©λλ€. μλ₯Ό λ€μ΄, "λ€νΈμν¬ μ€λ₯" λ©μμ§λ νλμ€μ΄λ‘λ "Erreur rΓ©seau" λλ μΌλ³Έμ΄λ‘λ "γγγγ―γΌγ―γ¨γ©γΌ"λ‘ λ²μλμ΄μΌ ν©λλ€.
- μκ°λ: μκ°λλ₯Ό μΌλμ λμμμ€. μμ½λ μ΄λ²€νΈ λλ λ§κ°μΌμ μ²λ¦¬ν λλ μ¬μ©μμ νμ§ μκ°λλ‘ μκ°μ μ μ₯νκ³ νμν©λλ€. μ¬μ©μμ μκ°λμ λν΄ κ°μ νμ§ λ§μμμ€.
useActionStateμ λν λμ
useActionState
λ μλ² μ‘μ
μμ μν μ
λ°μ΄νΈλ₯Ό κ΄λ¦¬νκΈ° μν κ°λ ₯ν λꡬμ΄μ§λ§, νΉμ μꡬ μ¬νμ λ°λΌ κ³ λ €ν μ μλ λ€λ₯Έ μ κ·Ό λ°©μμ΄ μμ΅λλ€.
- κΈ°μ‘΄ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬(Redux, Zustand, Jotai): μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μν κ΄λ¦¬μ λν λ³΄λ€ ν¬κ΄μ μΈ μ κ·Ό λ°©μμ μ 곡νμ¬ μ¬λ¬ κ΅¬μ± μμμμ μ ν리μΌμ΄μ
μνλ₯Ό κ΄λ¦¬ν μ μμ΅λλ€. κ·Έλ¬λ
useActionState
λ§μΌλ‘ μΆ©λΆν κ°λ¨ν μ¬μ© μ¬λ‘μλ κ³Όλν μ μμ΅λλ€. - Context API: Reactμ Context APIλ prop λλ¦΄λ§ μμ΄ κ΅¬μ± μμ κ°μ μνλ₯Ό 곡μ νλ λ°©λ²μ μ 곡ν©λλ€. μλ² μ‘μ
μ μνλ₯Ό κ΄λ¦¬νλ λ° μ¬μ©ν μ μμ§λ§
useActionState
λ³΄λ€ λ λ§μ μμ©κ΅¬ μ½λκ° νμν μ μμ΅λλ€. - μ¬μ©μ μ§μ ν
: μλ² μ‘μ
μ μνλ₯Ό κ΄λ¦¬νκΈ° μν΄ μ체 μ¬μ©μ μ§μ ν
μ λ§λ€ μ μμ΅λλ€.
useActionState
λλ λ€λ₯Έ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬κ° μΆ©μ‘±νμ§ μλ νΉμ μꡬ μ¬νμ΄ μλ κ²½μ° μ’μ μ΅μ μ΄ λ μ μμ΅λλ€.
κ²°λ‘
useActionState
ν
μ React μνκ³μ κ·μ€ν μΆκ° μμλ‘, μλ² μ‘μ
μ μν΄ νΈλ¦¬κ±°λ μν μ
λ°μ΄νΈλ₯Ό κ΄λ¦¬νλ κ°μνλκ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€. μ΄ ν
μ νμ©νμ¬ κ°λ°μλ μ½λλ² μ΄μ€λ₯Ό λ¨μννκ³ , μ¬μ©μ κ²½νμ κ°μ νλ©°, React μ ν리μΌμ΄μ
μ μ λ°μ μΈ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. κ΅μ ν λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμ¬ κΈλ‘λ² κ°λ°μλ λ€μν μ²μ€μκ² μ ν리μΌμ΄μ
μ μ‘μΈμ€ κ°λ₯νκ³ μ¬μ©μ μΉνμ μΌλ‘ λ§λ€ μ μμ΅λλ€.
Reactκ° κ³μ λ°μ ν¨μ λ°λΌ μλ² μ‘μ
κ³Ό useActionState
λ μ΅μ μΉ κ°λ°μμ μ μ λ μ€μν μν μ ν κ²μ
λλ€. μ΄λ¬ν κ°λ
μ λ§μ€ν°νλ©΄ νΈλ λλ₯Ό μμλκ°κ³ κΈλ‘λ² μ¬μ©μμ μꡬλ₯Ό μΆ©μ‘±νλ κ°λ ₯νκ³ νμ₯ κ°λ₯ν React μ ν리μΌμ΄μ
μ ꡬμΆν μ μμ΅λλ€.