Reactã®useFormStatusããã¯ããã¹ã¿ãŒããã·ãŒã ã¬ã¹ãªãã©ãŒã éä¿¡åŠçãé²æè¿œè·¡ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹åäžãå®çŸãå ç¢ã§äœ¿ãããããã©ãŒã ã®æ§ç¯æ¹æ³ãåŠã³ãŸãã
React useFormStatus: ãã©ãŒã éä¿¡ç¶æ ãšé²æè¿œè·¡ã®å æ¬çã¬ã€ã
ãã©ãŒã ã¯æ°å€ãã®Webã¢ããªã±ãŒã·ã§ã³ã®æ ¹å¹¹ããªãããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®äž»èŠãªã€ã³ã¿ãŒãã§ãŒã¹ãšããŠæ©èœããŸãããããããã©ãŒã ã®é信管çããšã©ãŒåŠçããŠãŒã¶ãŒãžã®ãã£ãŒãããã¯æäŸã¯è€éãªã¿ã¹ã¯ã«ãªãåŸãŸããReactã®useFormStatusããã¯ã¯ããã®ããã»ã¹ãç°¡çŽ åãããã©ãŒã ã®éä¿¡ç¶æ
ã远跡ããããçŽæçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã®åççãªæ¹æ³ãæäŸããŸãã
useFormStatusãšã¯ïŒ
React 18ã§å°å
¥ãããuseFormStatusã¯ã<form>èŠçŽ ã®éä¿¡ã¹ããŒã¿ã¹ã«é¢ããæ
å ±ãæäŸããããã«èšèšãããããã¯ã§ããããã«ããããã©ãŒã ãçŸåšéä¿¡äžããæ£åžžã«éä¿¡ãããããéä¿¡äžã«ãšã©ãŒãçºçãããã倿ã§ããŸãããã®æ
å ±ã¯ãUIã®æŽæ°ããã¿ã³ã®ç¡å¹åãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã®è¡šç€ºããŸãã¯ãŠãŒã¶ãŒãžã®ãšã©ãŒã¡ãã»ãŒãžã®æäŸã«äœ¿çšã§ããŸãã
useFormStatusã䜿çšããäž»ãªå©ç¹ïŒ
- ç°¡çŽ åããããã©ãŒã ç¶æ 管çïŒãã©ãŒã éä¿¡ã®ããã®æåã®ç¶æ 管çãäžèŠã«ãªãããã€ã©ãŒãã¬ãŒãã³ãŒããåæžããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒãã©ãŒã éä¿¡äžã«ãŠãŒã¶ãŒãžãªã¢ã«ã¿ã€ã ã®ãã£ãŒãããã¯ãæäŸãã䜿ãããããåäžãããŸãã
- ã¢ã¯ã»ã·ããªãã£ã®åŒ·åïŒéä¿¡äžã«ãã©ãŒã èŠçŽ ãç¡å¹ã«ããæç¢ºãªãšã©ãŒã¡ãã»ãŒãžãæäŸããããšã§ãã¢ã¯ã»ã·ãã«ãªãã©ãŒã æäœãå¯èœã«ããŸãã
- ããã©ãŒãã³ã¹ã®æé©åïŒãã©ãŒã ã®éä¿¡ç¶æ ãå¹ççã«è¿œè·¡ããäžèŠãªåã¬ã³ããªã³ã°ãé²ããŸãã
useFormStatusã®ä»çµã¿
useFormStatusããã¯ã¯ã<form>èŠçŽ ãã¬ã³ããªã³ã°ããReactã³ã³ããŒãã³ãå
ã§äœ¿çšãããŸãããã®ããã¯ã¯ã以äžã®ããããã£ãå«ããªããžã§ã¯ããè¿ããŸãïŒ
pending: ãã©ãŒã ãçŸåšéä¿¡äžãã©ããã瀺ãããŒã«å€ãdata: ãã©ãŒã ã®ã¢ã¯ã·ã§ã³é¢æ°ããè¿ãããããŒã¿ïŒæåããå ŽåïŒãmethod: ãã©ãŒã éä¿¡ã«äœ¿çšãããHTTPã¡ãœããïŒäŸïŒãPOSTãããGETãïŒãaction: ãã©ãŒã ãéä¿¡ããããšãã«åŒã³åºããã颿°ãerror: ãã©ãŒã éä¿¡ã倱æããå Žåã®ãšã©ãŒãªããžã§ã¯ãã
useFormStatusã䜿çšããã«ã¯ããŸããã©ãŒã ã®action颿°ãå®çŸ©ããå¿
èŠããããŸãããã®é¢æ°ã¯ãã©ãŒã ãéä¿¡ããããšãã«åŒã³åºãããŸããaction颿°å
ã§ãå¿
èŠãªããŒã¿åŠçãæ€èšŒããŸãã¯APIåŒã³åºããå®è¡ã§ããŸããaction颿°ã¯ãuseFormStatusããã¯ã®dataããããã£ã§å©çšå¯èœã«ãªãå€ãè¿ãå¿
èŠããããŸããã¢ã¯ã·ã§ã³ããšã©ãŒãã¹ããŒããå Žåããã®ãšã©ãŒã¯errorããããã£ã§å©çšå¯èœã«ãªããŸãã
useFormStatusã®å®çšäŸ
äŸ1ïŒåºæ¬çãªãã©ãŒã éä¿¡ã®è¿œè·¡
ãã®äŸã§ã¯ãuseFormStatusã䜿çšããŠç°¡åãªã³ã³ã¿ã¯ããã©ãŒã ã®éä¿¡ç¶æ
ã远跡ããæ¹æ³ã瀺ããŸãããã®äŸã¯React Server Component (RSC)ã§åäœããNext.jsãRemixã®ãããªãã¬ãŒã ã¯ãŒã¯ãå¿
èŠã§ãã
// app/contact/page.tsx (Next.js)
'use client';
import { useFormStatus } from 'react-dom';
async function submitForm(formData: FormData) {
"use server";
// APIåŒã³åºããã·ãã¥ã¬ãŒã
await new Promise((resolve) => setTimeout(resolve, 2000));
const name = formData.get('name') as string;
const email = formData.get('email') as string;
const message = formData.get('message') as string;
if (!name || !email || !message) {
throw new Error('ãã¹ãŠã®ãã£ãŒã«ããå
¥åããŠãã ããã');
}
console.log('Form Data:', { name, email, message });
return { message: 'ãã©ãŒã ãæ£åžžã«éä¿¡ãããŸããïŒ' };
}
export default function ContactForm() {
const { pending, data, error } = useFormStatus();
return (
);
}
ãã®äŸã§ã¯ãpendingç¶æ
ã䜿çšããŠããã©ãŒã ã®éä¿¡äžã«ãã©ãŒã å
¥åãšéä¿¡ãã¿ã³ãç¡å¹ã«ããŠããŸãããŸãããã¿ã³ã®ããã¹ããåçã«ãéä¿¡äž...ãã«å€æŽãããŠãŒã¶ãŒã«èŠèŠçãªãã£ãŒãããã¯ãæäŸããŸããæåãããšãsubmitFormã¢ã¯ã·ã§ã³ããã®dataã衚瀺ãããŸããéä¿¡äžã«ãšã©ãŒãçºçããå Žåã¯ãerrorã¡ãã»ãŒãžããŠãŒã¶ãŒã«è¡šç€ºãããŸãã
äŸ2ïŒããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã®è¡šç€º
ãã®äŸã§ã¯ããã©ãŒã ã®éä¿¡äžã«ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããæ¹æ³ã瀺ããŸããããã¯ãé·æéã®APIåŒã³åºããè€éãªããŒã¿åŠçã䌎ããã©ãŒã ã«ç¹ã«äŸ¿å©ã§ãã
// äŸ1ãšåæ§ã®ã³ã³ããŒãã³ãæ§é
export default function ContactForm() {
const { pending, data, error } = useFormStatus();
return (
);
}
ãã®äŸã§ã¯ãpendingç¶æ
ãtrueã®ãšãã«åçŽãªãèªã¿èŸŒã¿äž...ãã¡ãã»ãŒãžã衚瀺ãããŸããããããã¹ãããŒãããã°ã¬ã¹ããŒã®ãããªãããæŽç·ŽãããããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã«çœ®ãæããããšãã§ããŸãã
äŸ3ïŒãã©ãŒã æ€èšŒãšã©ãŒã®åŠç
ãã®äŸã§ã¯ãuseFormStatusã䜿çšããŠãã©ãŒã ã®æ€èšŒãšã©ãŒãåŠçããæ¹æ³ã瀺ããŸããaction颿°ã¯æ€èšŒãå®è¡ããæ€èšŒã«ãŒã«ã«éåããå Žåã¯ãšã©ãŒãã¹ããŒããŸãã
// äŸ1ãšåæ§ã®ã³ã³ããŒãã³ãæ§é
async function submitForm(formData: FormData) {
"use server";
const name = formData.get('name') as string;
const email = formData.get('email') as string;
const message = formData.get('message') as string;
if (!name) {
throw new Error('ååã¯å¿
é ã§ãã');
}
if (!email) {
throw new Error('ã¡ãŒã«ã¢ãã¬ã¹ã¯å¿
é ã§ãã');
}
if (!message) {
throw new Error('ã¡ãã»ãŒãžã¯å¿
é ã§ãã');
}
// APIåŒã³åºããã·ãã¥ã¬ãŒã
await new Promise((resolve) => setTimeout(resolve, 2000));
console.log('Form Data:', { name, email, message });
return { message: 'ãã©ãŒã ãæ£åžžã«éä¿¡ãããŸããïŒ' };
}
export default function ContactForm() {
const { pending, data, error } = useFormStatus();
return (
);
}
ãã®äŸã§ã¯ãaction颿°ãååãã¡ãŒã«ã¢ãã¬ã¹ãã¡ãã»ãŒãžã®åãã£ãŒã«ãã空ã§ãªããã確èªããŸãããããã®ãã£ãŒã«ãã®ããããã空ã®å Žåã察å¿ããã¡ãã»ãŒãžãšãšãã«ãšã©ãŒãã¹ããŒããŸãããã®åŸãuseFormStatusããã¯ã®errorããããã£ã䜿çšããŠããŠãŒã¶ãŒã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãã
é«åºŠãªäœ¿çšäŸãšèæ ®äºé
ãµãŒãããŒãã£ã®ãã©ãŒã ã©ã€ãã©ãªãšã®çµ±å
useFormStatusã¯ãã©ãŒã éä¿¡ç¶æ
ã远跡ããããã®ãã€ãã£ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãããFormikãReact Hook Formãªã©ã®ãµãŒãããŒãã£ã®ãã©ãŒã ã©ã€ãã©ãªãšçµ±åããããšãã§ããŸãããããã®ã©ã€ãã©ãªã¯ããã©ãŒã æ€èšŒããã£ãŒã«ã管çãç¶æ
管çãªã©ãããé«åºŠãªæ©èœãæäŸããŸããuseFormStatusããããã®ã©ã€ãã©ãªãšçµã¿åãããããšã§ãé«åºŠã«ã«ã¹ã¿ãã€ãºå¯èœã§å
ç¢ãªãã©ãŒã ãäœæã§ããŸãã
FormikãReact Hook Formãšçµ±åããã«ã¯ãããããã®ãã©ãŒã éä¿¡ãã³ãã©ãŒã掻çšããuseFormStatusã䜿çšããŠå
šäœçãªéä¿¡ç¶æ
ã远跡ããŸããããããServer Actionãäœæããå¿
èŠã¯ãããŸãããã¯ã©ã€ã¢ã³ãåŽã®ãã©ãŒã ç¶æ
管çã¯éžæããã©ã€ãã©ãªã«ãã£ãŠåŠçãããã§ãããã
éåææäœã®åŠç
å€ãã®ãã©ãŒã ã«ã¯ãAPIåŒã³åºããããŒã¿ããŒã¹ã¯ãšãªãªã©ã®éåææäœãå«ãŸããŸããéåææäœãæ±ãéã«ã¯ããã©ãŒã éä¿¡ãæ£ããåŠçããããŠãŒã¶ãŒã«é©åãªãã£ãŒãããã¯ãæäŸãããããšã確èªããããšãéèŠã§ããuseFormStatusããã¯ã¯ããã©ãŒã ãéåææäœã®å®äºãåŸ
ã£ãŠããããšã瀺ãããã«äœ¿çšã§ããpendingç¶æ
ãæäŸããããšã§ããã®ããã»ã¹ãç°¡çŽ åããŸãã
ãŸããéåææäœäžã«çºçããå¯èœæ§ã®ãããšã©ãŒãé©åã«åŠçããããã«ãå
ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£
ããããšãéèŠã§ããuseFormStatusããã¯ã®errorããããã£ã䜿çšããŠããŠãŒã¶ãŒã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ã§ããŸãã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
ã¢ã¯ã»ã·ããªãã£ã¯Webéçºã®éèŠãªåŽé¢ã§ããããã©ãŒã ãäŸå€ã§ã¯ãããŸããããã©ãŒã ãæ§ç¯ããéã«ã¯ãé害ãæã€ãŠãŒã¶ãŒã«ãã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããããšãéèŠã§ããuseFormStatusããã¯ã¯ã以äžã®æ¹æ³ã§ãã©ãŒã ã®ã¢ã¯ã»ã·ããªãã£ãåäžãããããã«äœ¿çšã§ããŸãïŒ
- éä¿¡äžã®ãã©ãŒã èŠçŽ ã®ç¡å¹åïŒããã«ããããŠãŒã¶ãŒã誀ã£ãŠãã©ãŒã ãè€æ°åéä¿¡ããã®ãé²ããŸãã
- æç¢ºãªãšã©ãŒã¡ãã»ãŒãžã®æäŸïŒãšã©ãŒã¡ãã»ãŒãžã¯ç°¡æœã§ãæçã§ãç°¡åã«çè§£ã§ãããã®ã§ããã¹ãã§ãããŸããARIA屿§ã䜿çšããŠå¯Ÿå¿ãããã©ãŒã ãã£ãŒã«ãã«é¢é£ä»ããå¿ èŠããããŸãã
- ARIA屿§ã®äœ¿çšïŒARIA屿§ã䜿çšããŠããã©ãŒã ãšãã®èŠçŽ ã«é¢ããè¿œå æ
å ±ãæ¯æŽæè¡ã«æäŸã§ããŸããäŸãã°ã
aria-describedby屿§ã䜿çšããŠãšã©ãŒã¡ãã»ãŒãžããã©ãŒã ãã£ãŒã«ãã«é¢é£ä»ããããšãã§ããŸãã
ããã©ãŒãã³ã¹ã®æé©å
useFormStatusã¯äžè¬çã«å¹ççã§ãããè€éãªãã©ãŒã ãæ§ç¯ããéã«ã¯ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ
®ããããšãéèŠã§ããuseFormStatusã䜿çšããã³ã³ããŒãã³ãå
ã§é«ã³ã¹ããªèšç®ãAPIåŒã³åºããè¡ãããšã¯é¿ããŠãã ããã代ããã«ããããã®ã¿ã¹ã¯ã¯action颿°ã«å§è²ããŠãã ããã
ãŸããäžèŠãªåã¬ã³ããªã³ã°ã«ã泚æããŠãã ãããReactã®ã¡ã¢åæè¡ïŒäŸïŒReact.memoãuseMemoãuseCallbackïŒã䜿çšããŠãã³ã³ããŒãã³ãããã®ããããã£ã倿Žãããªãéãåã¬ã³ããªã³ã°ãããªãããã«ããŸãã
useFormStatusã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
action颿°ãç°¡æœã§éäžçã«ä¿ã€ïŒaction颿°ã¯äž»ã«ããŒã¿åŠçãæ€èšŒãAPIåŒã³åºããåŠçãã¹ãã§ããaction颿°å ã§è€éãªUIæŽæ°ããã®ä»ã®å¯äœçšãå®è¡ããããšã¯é¿ããŠãã ããã- ãŠãŒã¶ãŒã«æç¢ºã§æçãªãã£ãŒãããã¯ãæäŸããïŒ
useFormStatusããã¯ã®pendingãdataãerrorããããã£ã䜿çšããŠããã©ãŒã éä¿¡äžã«ãŠãŒã¶ãŒã«ãªã¢ã«ã¿ã€ã ã®ãã£ãŒãããã¯ãæäŸããŸãã - å ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããïŒãã©ãŒã éä¿¡äžã«çºçããå¯èœæ§ã®ãããšã©ãŒãé©åã«åŠçãããŠãŒã¶ãŒã«æçãªãšã©ãŒã¡ãã»ãŒãžãæäŸããŸãã
- ã¢ã¯ã»ã·ããªãã£ãèæ ®ããïŒã¢ã¯ã»ã·ããªãã£ã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠããã©ãŒã ãé害ãæã€ãŠãŒã¶ãŒã«ãã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŸãã
- ããã©ãŒãã³ã¹ãæé©åããïŒ
useFormStatusã䜿çšããã³ã³ããŒãã³ãå ã§ã®äžèŠãªåã¬ã³ããªã³ã°ãé«ã³ã¹ããªèšç®ãé¿ããŸãã
äžçäžã®å®äžçã§ã®å¿çšãšäºäŸ
useFormStatusããã¯ã¯ãããŸããŸãªæ¥çãå°ççãªå Žæã§ã倿§ãªãã©ãŒã ããŒã¹ã®ã·ããªãªã«é©çšã§ããŸãã以äžã«ããã€ãã®äŸãæããŸãïŒ
- Eã³ããŒã¹ïŒã°ããŒãã«ïŒïŒãªã³ã©ã€ã³ã¹ãã¢ã¯
useFormStatusã䜿çšããŠæ³šæãã©ãŒã ã®éä¿¡ã远跡ã§ããŸããpendingç¶æ ã¯ã泚æåŠçäžã«ã泚æã確å®ããã¿ã³ãç¡å¹ã«ããããã«äœ¿çšã§ããerrorç¶æ ã¯ã泚æã®éä¿¡ã倱æããå ŽåïŒäŸïŒæ¯æãåé¡ãåšåº«äžè¶³ã«ããïŒã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããã«äœ¿çšã§ããŸãã - ãã«ã¹ã±ã¢ïŒãšãŒãããïŒïŒå»çæäŸè
ã¯
useFormStatusã䜿çšããŠæ£è ç»é²ãã©ãŒã ã®éä¿¡ã远跡ã§ããŸããpendingç¶æ ã¯ãæ£è æ å ±ãåŠçãããŠããéã«ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããããã«äœ¿çšã§ããdataç¶æ ã¯ãç»é²ãæåããéã«ç¢ºèªã¡ãã»ãŒãžã衚瀺ããããã«äœ¿çšã§ããŸããGDPRïŒäžè¬ããŒã¿ä¿è·èŠåïŒã®éµå®ãæåªå ã§ãããããŒã¿ãã©ã€ãã·ãŒéåã«é¢é£ãããšã©ãŒã¡ãã»ãŒãžã¯æ éã«åŠçããå¿ èŠããããŸãã - æè²ïŒã¢ãžã¢ïŒïŒãªã³ã©ã€ã³åŠç¿ãã©ãããã©ãŒã ã¯
useFormStatusã䜿çšããŠèª²é¡ã¢ããããŒãã®éä¿¡ã远跡ã§ããŸããpendingç¶æ ã¯ã課é¡ãã¢ããããŒããããŠããéã«ãæåºããã¿ã³ãç¡å¹ã«ããããã«äœ¿çšã§ããerrorç¶æ ã¯ãã¢ããããŒãã倱æããå ŽåïŒäŸïŒãã¡ã€ã«ãµã€ãºã®å¶éããããã¯ãŒã¯ã®åé¡ã«ããïŒã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããã«äœ¿çšã§ããŸããåœã«ãã£ãŠåŠè¡åºæºãæåºèŠä»¶ãç°ãªãå Žåãããããã©ãŒã ã¯ããã«å¯Ÿå¿ããå¿ èŠããããŸãã - éèãµãŒãã¹ïŒåç±³ïŒïŒéè¡ã¯
useFormStatusã䜿çšããŠããŒã³ç³èŸŒãã©ãŒã ã®éä¿¡ã远跡ã§ããŸããpendingç¶æ ã¯ãç³èŸŒãåŠçãããŠããéã«ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããããã«äœ¿çšã§ããdataç¶æ ã¯ãããŒã³ã®æ¿èªç¶æ³ã衚瀺ããããã«äœ¿çšã§ããŸããéèèŠå¶ïŒäŸïŒKYC - 顧客確èªïŒã®éµå®ãéèŠã§ãããã³ã³ãã©ã€ã¢ã³ã¹åé¡ã«é¢é£ãããšã©ãŒã¡ãã»ãŒãžã¯æç¢ºãã€å ·äœçã§ãªããã°ãªããŸããã - è¡æ¿ãµãŒãã¹ïŒåç±³ïŒïŒæ¿åºæ©é¢ã¯
useFormStatusã䜿çšããŠåžæ°ããã®ãã£ãŒãããã¯ãã©ãŒã ã®éä¿¡ã远跡ã§ããŸããpendingç¶æ ã¯ããã£ãŒãããã¯ãåŠçãããŠããéã«ãéä¿¡ããã¿ã³ãç¡å¹ã«ããããã«äœ¿çšã§ããdataç¶æ ã¯ãéä¿¡ãæåããéã«ç¢ºèªã¡ãã»ãŒãžã衚瀺ããããã«äœ¿çšã§ããŸããåžæ°ã¯ããžã¿ã«ãªãã©ã·ãŒãæè¡ãžã®ã¢ã¯ã»ã¹ã¬ãã«ãç°ãªãå¯èœæ§ããããããã¢ã¯ã»ã·ããªãã£ã¯éåžžã«éèŠã§ãããã©ãŒã ã¯è€æ°ã®èšèªã§å©çšå¯èœã§ãªããã°ãªããŸããã
äžè¬çãªåé¡ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
useFormStatusãæŽæ°ãããªãïŒReact 18以éã䜿çšããŠããããšãããã³ãã©ãŒã ã«actionãæ£ããå®çŸ©ãããŠããããšã確èªããŠãã ãããServer Actionã"use server"ãã£ã¬ã¯ãã£ãã䜿çšããŠæ£ããå®çŸ©ãããŠããããšã確èªããŸãã- ãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããªãïŒ
action颿°ãæ£ãããšã©ãŒãã¹ããŒããŠããããšãããã³ã³ã³ããŒãã³ãã§error.messageã衚瀺ããŠããããšãå確èªããŠãã ããããã©ãŒã éä¿¡äžã®ãšã©ãŒããªããã³ã³ãœãŒã«ã調æ»ããŸãã - ãã©ãŒã ãè€æ°åéä¿¡ãããïŒèª€ã£ãããã«ã¯ãªãã¯ãé²ãããã«ãéä¿¡ãã¿ã³ã
pendingç¶æ ã䜿çšããŠç¡å¹ã«ãªã£ãŠããããšã確èªããŠãã ããã
çµè«
Reactã®useFormStatusããã¯ã¯ããã©ãŒã ã®éä¿¡ç¶æ
ã远跡ããããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã®åŒ·åã§äŸ¿å©ãªæ¹æ³ãæäŸããŸãããã©ãŒã ã®ç¶æ
管çãç°¡çŽ åããã¢ã¯ã»ã·ããªãã£ãåäžãããããã©ãŒãã³ã¹ãæé©åããããšã§ãuseFormStatusã¯éçºè
ãå
ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãã©ãŒã ãæ§ç¯ããã®ãæ¯æŽããŸãããã®æ©èœãšãã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ãuseFormStatusãæŽ»çšããŠãReactã¢ããªã±ãŒã·ã§ã³ã§ã·ãŒã ã¬ã¹ã§é
åçãªãã©ãŒã ã€ã³ã¿ã©ã¯ã·ã§ã³ãäœæã§ããŸãã