Reactã®useFormStatusããã¯ã䜿ã£ãŠãã©ãŒã éä¿¡ç¶æ ã广çã«ç®¡çããæ¹æ³ãåŠã³ãŸãããããã®ã¬ã€ãã§ã¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããã®è©³çްãªè§£èª¬ãå®è·µçãªäŸãã°ããŒãã«ãªãã¹ããã©ã¯ãã£ã¹ãæäŸããŸãã
Reactã®useFormStatusããã¹ã¿ãŒããïŒãã©ãŒã éä¿¡ç¶æ ã®å æ¬çãªã¬ã€ã
çŸä»£ã®ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ãããŠããã©ãŒã ã¯éåšããŠããŸããåãåãããã©ãŒã ãç»é²ããŒãžãããè€éãªããŒã¿å
¥åã€ã³ã¿ãŒãã§ãŒã¹ã«è³ããŸã§ããã©ãŒã ã¯ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®äž»èŠãªææ®µã§ãããããã®ãã©ãŒã ã®ç¶æ
ãç¹ã«éä¿¡ããã»ã¹äžã®ç¶æ
ã管çããããšã¯ãã¹ã ãŒãºã§çŽæçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã«äžå¯æ¬ ã§ããReact 18ã§å°å
¥ãããReactã®useFormStatus
ããã¯ã¯ããã©ãŒã éä¿¡ç¶æ
ãåŠçããããã®åçåãããã¢ãããŒããæäŸããéçºè
ããªã¢ã«ã¿ã€ã ã®ãã£ãŒãããã¯ãæäŸããã¢ããªã±ãŒã·ã§ã³å
šäœã®å¿çæ§ãåäžãããããšãå¯èœã«ããŸãã
ãã©ãŒã éä¿¡ç¶æ ã®éèŠæ§ãçè§£ãã
ãŠãŒã¶ãŒããã©ãŒã ãéä¿¡ãããšãããã€ãã®ç¶æ ãååšããŸãïŒåæç¶æ ãéä¿¡äžç¶æ ïŒããŒã¿è»¢éäžïŒãããã³å®äºç¶æ ïŒæåãŸãã¯ãšã©ãŒïŒããããã®ç¶æ ããŠãŒã¶ãŒã«æ£ç¢ºã«åæ ãããããšã¯ãããã€ãã®çç±ã§äžå¯æ¬ ã§ãã
- ãŠãŒã¶ãŒãã£ãŒãããã¯ïŒããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãæåã¡ãã»ãŒãžãªã©ã®æç¢ºãªèŠèŠçåå³ãæäŸããããšã§ããŠãŒã¶ãŒã¯èªåã®ã¢ã¯ã·ã§ã³ãåŠçäžã§ããããšãç¥ãããšãã§ããŸããããã«ããããŠãŒã¶ãŒãäžæºãæãããããã©ãŒã ãç¹°ãè¿ãéä¿¡ãããããã®ãé²ããŸãã
- ãšã©ãŒãã³ããªã³ã°ïŒæ å ±ã«å¯ãã ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããšã¯ããŠãŒã¶ãŒãäœãåé¡ã ã£ãã®ããã©ã®ããã«å ¥åãä¿®æ£ãã¹ãããçè§£ããã®ã«åœ¹ç«ã¡ãŸããããã«ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããµããŒããªã¯ãšã¹ããæžå°ããŸãã
- ãŠãŒã¶ããªãã£ã®åäžïŒéä¿¡äžã«éä¿¡ãã¿ã³ãç¡å¹ã«ããããšã§ãããŒã¿ã®äžæŽåãäžèŠãªãµãŒããŒè² è·ã«ã€ãªããå¯èœæ§ã®ããè€æ°åã®éä¿¡ãé²ããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒãã©ãŒã ã®ç¶æ ãé©åã«ç®¡çããããšã§ãé害ãæã€ãŠãŒã¶ãŒã®ã¢ã¯ã»ã·ããªãã£ãåäžããããå æ¬çã§äœ¿ãããããšã¯ã¹ããªãšã³ã¹ãä¿èšŒãããŸãã
Reactã®useFormStatus
ããã¯ã®ç޹ä»
useFormStatus
ããã¯ã¯ããã©ãŒã éä¿¡ã®çŸåšã®ã¹ããŒã¿ã¹ã«é¢ããæ
å ±ãæäŸããããšã§ããã©ãŒã éä¿¡ç¶æ
ã®ç®¡çããã»ã¹ãç°¡çŽ åããŸããããã€ãã®äž»èŠãªããããã£ãæäŸããŸãã
pending
: ãã©ãŒã ãçŸåšéä¿¡äžã§ãããã©ããã瀺ãããŒã«å€ãmethod
: ãã©ãŒã éä¿¡ã«äœ¿çšãããHTTPã¡ãœããïŒäŸïŒ'GET', 'POST'ïŒãaction
: ãã©ãŒã ãéä¿¡ãããURLãformData
: éä¿¡ããããã©ãŒã ããŒã¿ã
ãã®ããã¯ã¯ããã©ãŠã¶ã®çµã¿èŸŒã¿ãã©ãŒã åŠçãšã·ãŒã ã¬ã¹ã«é£æºããReactã³ã³ããŒãã³ãå ã§ãã©ãŒã ã®ç¶æ ã管çããããã®ã¯ãªãŒã³ã§å®£èšçãªæ¹æ³ãæäŸããŸãã
å®è·µçãªå®è£ ïŒåºæ¬çãªãã©ãŒã éä¿¡ç¶æ
ç°¡åãªåãåãããã©ãŒã ãäœæããuseFormStatus
ã䜿çšããŠãã®éä¿¡ç¶æ
ã管çããæ¹æ³ããã¢ã³ã¹ãã¬ãŒã·ã§ã³ããŸããããåºæ¬çãªãã©ãŒã æ§é ããå§ããŸãã
import React from 'react';
import { useFormStatus }react-dom';
function ContactForm() {
const { pending } = useFormStatus();
return (
);
}
export default ContactForm;
ãã®äŸã§ã¯ã次ã®ããã«ãªããŸãã
useFormStatus
ã'react-dom'
ããã€ã³ããŒãããŸãã- ãã®ããã¯ã䜿çšããŠ
pending
ç¶æ ãååŸããŸãã pending
ãtrueã®å Žåãéä¿¡ãã¿ã³ãç¡å¹ã«ããŸãã- ãã©ãŒã éä¿¡äžã¯ãã¿ã³ã®ããã¹ãããSubmitting...ãã«å€æŽããŸãã
ããã«ããããŠãŒã¶ãŒã«å³åº§ã«èŠèŠçãªãã£ãŒãããã¯ãæäŸãããéä¿¡ãé²è¡äžã§ããããšã瀺ãããŸãã
é«åºŠãªäŸïŒããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãšæå/ãšã©ãŒã¡ãã»ãŒãžã®å®è£
éä¿¡æã«ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãå«ããæåãŸãã¯ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããã«ãåãåãããã©ãŒã ã匷åããŸããããããã«ãããããæŽç·ŽããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå®çŸããŸãã
import React, { useState } from 'react';
import { useFormStatus } from 'react-dom';
function ContactForm() {
const { pending } = useFormStatus();
const [submissionResult, setSubmissionResult] = useState(null);
const handleSubmit = async (event) => {
event.preventDefault();
try {
const formData = new FormData(event.target);
const response = await fetch('/api/contact', {
method: 'POST',
body: formData,
});
if (response.ok) {
setSubmissionResult({ success: true, message: 'Message sent successfully!' });
event.target.reset(); // Clear the form
} else {
const errorData = await response.json();
setSubmissionResult({ success: false, message: errorData.message || 'An error occurred.' });
}
} catch (error) {
setSubmissionResult({ success: false, message: 'An unexpected error occurred.' });
}
};
return (
);
}
export default ContactForm;
ãã®äŸã§ã®äž»ãªæ¹åç¹ïŒ
- ç¶æ
管çïŒ
useState
ããã¯ã䜿çšããŠãæåãŸãã¯ãšã©ãŒã¡ãã»ãŒãžãæ ŒçŽããsubmissionResult
ã管çããŸãã - ãã©ãŒã åŠçïŒ
handleSubmit
颿°ã¯ãã©ãŒã éä¿¡æã«åŒã³åºãããããã©ã«ãã®ãã©ãŠã¶éä¿¡åäœãé²ããŸãã - APIã€ã³ã¿ã©ã¯ã·ã§ã³ïŒ
fetch
APIã䜿çšããŠããã©ãŒã ããŒã¿ãããã¯ãšã³ãAPIãšã³ããã€ã³ãïŒ/api/contact
ïŒã«éä¿¡ããŸããå®éã®APIãšã³ããã€ã³ãã«çœ®ãæããŠãã ããã - ãšã©ãŒãã³ããªã³ã°ïŒ
try...catch
ãããã¯ãå«ããã¬ã¹ãã³ã¹ã¹ããŒã¿ã¹ããã§ãã¯ããŠãéä¿¡äžã®æœåšçãªãšã©ãŒãåŠçããŸããããã«ãããé©åãªãšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºãå¯èœã«ãªããŸãã - æå/ãšã©ãŒã¡ãã»ãŒãžïŒAPIã¬ã¹ãã³ã¹ã«åºã¥ããŠãæåãŸãã¯ãšã©ãŒã¡ãã»ãŒãžãæ¡ä»¶ä»ãã§ã¬ã³ããªã³ã°ããŸãããŸããéä¿¡ãæåããå Žåã¯ãã©ãŒã ããªã»ããããŸãã
- CSSã¹ã¿ã€ãªã³ã°ïŒ (ã¹ã¿ã€ãªã³ã°ã®ããã«ãããã®ã¯ã©ã¹ãCSSã«è¿œå ããããšãæ€èšããŠãã ãã)
.success-message { color: green; }
.error-message { color: red; }
ã°ããŒãã«ãªèæ ®äºé ïŒåœéçãªãŠãŒã¶ãŒã®ããã®ãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®ãã©ãŒã ãèšèšããéã«ã¯ãå æ¬æ§ãšè¯å®çãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããããã«ãããŸããŸãªèŠçŽ ãèæ ®ããããšãéèŠã§ãã
- ããŒã«ãªãŒãŒã·ã§ã³ïŒãã¹ãŠã®ãã©ãŒã ã©ãã«ãã¡ãã»ãŒãžããšã©ãŒã¡ãã»ãŒãžããŠãŒã¶ãŒã®åžæããèšèªã«ç¿»èš³ããŸãããã®ããã»ã¹ãèªååããããã«ã翻蚳ã©ã€ãã©ãªãŸãã¯ãµãŒãã¹ã®äœ¿çšãæ€èšããŠãã ããã
- æ¥æåœ¢åŒïŒæ··ä¹±ãé¿ããæç¢ºæ§ã確ä¿ããããã«ãåœéçãªæ¥æåœ¢åŒïŒäŸïŒYYYY-MM-DDïŒã䜿çšããŸããæåŸ ããã圢åŒã®äŸã衚瀺ããŸãã
- é貚圢åŒïŒãã©ãŒã ãéèååŒã䌎ãå Žåãé貚èšå·ãšåœ¢åŒãæç¢ºã«è¡šç€ºããŸãããŠãŒã¶ãŒã®å Žæã«åºã¥ããŠé貚ãèªåçã«æ€åºãããããŠãŒã¶ãŒãé貚ãéžæã§ããããã«ããããšãæ€èšããŠãã ããã
- é»è©±çªå·å ¥åïŒåœã«é¢ä¿ãªããŠãŒã¶ãŒãæ£ç¢ºã«é»è©±çªå·ãå ¥åã§ããããã«ãåœã³ãŒãã»ã¬ã¯ã¿ãŒãŸãã¯ãã¹ã¯ãããå ¥åãã£ãŒã«ããæäŸããŸãã
- äœæãã£ãŒã«ãïŒåœéçãªäœæåœ¢åŒã«å¯Ÿå¿ããããã«ãäœæãªãŒãã³ã³ããªãŒããµãŒãã¹ã䜿çšããŠããŠãŒã¶ãŒãäœæãè¿ éãã€æ£ç¢ºã«å ¥åã§ããããã«ããããšãæ€èšããŠãã ããã
- å ¥åæ€èšŒïŒãŠãŒã¶ãŒãæå¹ãªããŒã¿ãå ¥åããããã«ãå ç¢ãªå ¥åæ€èšŒãå®è£ ããŸããåé¡ãšä¿®æ£æ¹æ³ã説æããæç¢ºã§ç°¡æœãªãšã©ãŒã¡ãã»ãŒãžãæäŸããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒãã©ãŒã ãé害ãæã€ãŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŸããããã«ã¯ãã»ãã³ãã£ãã¯HTMLã®äœ¿çšãç»åãžã®ä»£æ¿ããã¹ãã®æäŸãããŒããŒãã䜿çšããŠãã©ãŒã ãããã²ãŒãã§ããããšã®ç¢ºèªãå«ãŸããŸããã¹ã¯ãªãŒã³ãªãŒããŒã§ãã¹ãããŠãã ããã
- ã»ãã¥ãªãã£ïŒç¹ã«å人è奿 å ±ïŒPIIïŒãéä¿¡ããéã¯ãå®å šãªã³ãŒãã£ã³ã°ãã©ã¯ãã£ã¹ã§ãŠãŒã¶ãŒããŒã¿ãä¿è·ããŸããHTTPSã䜿çšããå ¥åãµãã¿ã€ãºãã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒé²æ¢ãªã©ã®å¯Ÿçãå®è£ ããããšãæ€èšããŠãã ããã
é«åºŠãªãã¯ããã¯ïŒuseFormStatus
ãè€éãªãã©ãŒã ã«æŽ»çšãã
åºæ¬çãªäŸã¯æçšã§ãããããè€éãªã·ããªãªã§useFormStatus
ã䜿çšããããšãã§ããŸãã
1. è€æ°ã®éä¿¡ãã¿ã³
è€æ°ã®éä¿¡ãã¿ã³ïŒäŸïŒãä¿åããŠéããããšãä¿åããŠæ°èŠäœæãïŒããããã©ãŒã ã§ã¯ãåãã¿ã³ã«useFormStatus
ããã¯ã䜿çšã§ããŸããããã«ããããã®ãã¿ã³ã®ã¢ã¯ã·ã§ã³ã«é¢é£ããéä¿¡ç¶æ
ã«åºã¥ããŠãç°ãªãããŒãã£ã³ã°ç¶æ
ã衚瀺ããããç¹å®ã®ãã¿ã³ãç¡å¹ã«ãããããããšãã§ããŸãã
import React from 'react';
import { useFormStatus } from 'react-dom';
function MyForm() {
const saveAndCloseStatus = useFormStatus({
action: '/api/save-and-close'
});
const saveAndNewStatus = useFormStatus({
action: '/api/save-and-new'
});
return (
);
}
export default MyForm;
ããã§ã¯ãaction
ãªãã·ã§ã³ã䜿çšããŠãã©ã®ãã¿ã³ã®éä¿¡ã¹ããŒã¿ã¹ã远跡ãããããæå®ããŸãã
2. ãã©ãŒã æ€èšŒãã£ãŒãããã¯
useFormStatus
ããã©ãŒã æ€èšŒã©ã€ãã©ãªïŒäŸïŒFormik, React Hook FormïŒãšçµã¿åãããŠãæ€èšŒããã»ã¹äžã«ãªã¢ã«ã¿ã€ã ã®ãã£ãŒãããã¯ãæäŸããŸãããããã®ã©ã€ãã©ãªã¯æ€èšŒããžãã¯ãåŠçããŸãããuseFormStatus
ã¯ãæ€èšŒãå®è¡äžïŒéåæã®å ŽåïŒãŸãã¯æ€èšŒçµæã«åºã¥ããŠãã©ãŒã ãéä¿¡ãããåã«ãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ã§ããŸãã
import React from 'react';
import { useFormStatus } from 'react-dom';
import { useFormik } from 'formik'; // Example form library
import * as Yup from 'yup';
function MyForm() {
const { pending } = useFormStatus();
const formik = useFormik({
initialValues: { email: '' },
validationSchema: Yup.object({
email: Yup.string().email('Invalid email address').required('Required'),
}),
onSubmit: async (values) => {
// Simulate an API call
await new Promise(resolve => setTimeout(resolve, 1000));
alert(JSON.stringify(values, null, 2));
},
});
return (
);
}
export default MyForm;
ããã¯ããã©ãŒã ã©ã€ãã©ãªãšéä¿¡ç¶æ
ãçµ±åããæ¹æ³ã瀺ããŠããŸããYup
ãšformik
ã䜿çšãããã©ãŒã æ€èšŒãå«ããŸããã
3. æ¡ä»¶ä»ããã©ãŒã ã»ã¯ã·ã§ã³
ãã©ãŒã éä¿¡ã¹ããŒã¿ã¹ã«åºã¥ããŠããã©ãŒã ã»ã¯ã·ã§ã³ãæ¡ä»¶ä»ãã§ã¬ã³ããªã³ã°ã§ããŸããããšãã°ãæåããéä¿¡åŸã«ç¢ºèªããŒãžã衚瀺ãããããŠãŒã¶ãŒããªãã€ã¬ã¯ããããããŸããããã«ãããè€æ°ããŒãžã«ãŸããããã«ãã¹ããããã©ãŒã ãåçãªãã©ãŒã ã³ã³ãã³ããäœæã§ããŸãã
useFormStatus
ã䜿çšãã广çãªãã©ãŒã 管çã®ããã®ãã¹ããã©ã¯ãã£ã¹
- ã·ã³ãã«ã«ä¿ã€ïŒåºæ¬çãªå®è£ ããå§ããå¿ èŠã«å¿ããŠåŸã ã«è€éãã远å ããŸããéå°ãªèšèšã¯é¿ããŠãã ããã
- æç¢ºãªèŠèŠçåå³ïŒããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãæåã¡ãã»ãŒãžããšã©ãŒã¡ãã»ãŒãžãªã©ãåžžã«ãŠãŒã¶ãŒã«æç¢ºãªèŠèŠçãã£ãŒãããã¯ãæäŸããŸãã
- ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãšã©ãŒã¡ãã»ãŒãžïŒç¹å®ãããããå®è¡å¯èœã§ããŠãŒã¶ãŒãçè§£ãããããšã©ãŒã¡ãã»ãŒãžãèšè¿°ããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒãã©ãŒã ãé害ãæã€ãŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŸããARIA屿§ãšã»ãã³ãã£ãã¯HTMLã䜿çšããŸãã
- 培åºçãªãã¹ãïŒããŸããŸãªãã©ãŠã¶ãããã€ã¹ããããã¯ãŒã¯æ¡ä»¶ã§ãã©ãŒã ããã¹ãããæ£ããæ©èœããããšã確èªããŸããããžãã£ããã¹ããšãã¬ãã£ããã¹ãã®äž¡æ¹ã䜿çšããŸãã
- ãšããžã±ãŒã¹ãèæ ®ããïŒéä¿¡äžã«ãŠãŒã¶ãŒãã€ã³ã¿ãŒãããæ¥ç¶ã倱ã£ããããµãŒããŒãå©çšã§ããªããªã£ãããããªã©ã®ãšããžã±ãŒã¹ã«ã€ããŠèããŸããå¿ èŠã«å¿ããŠé©åãªãšã©ãŒãã³ããªã³ã°ãšå詊è¡ã¡ã«ããºã ãå®è£ ããŸãã
- ææ°ã®ç¶æ
ãä¿ã€ïŒææ°ã®Reactããã³ãã©ãŠã¶æ©èœã«åžžã«æ³šç®ãããã©ãŒã åŠçãæ¹åããæ°ããæ¹æ³ãå°å
¥ãããå¯èœæ§ããããããææ°ã®ç¶æ
ãä¿ã¡ãŸããããšãã°ãæ°ãã
useTransition
ããã¯ã¯å¿çæ§ãåäžãããããã«çµã¿èŸŒãããšãã§ããŸãã
çµè«ïŒReact useFormStatus
ã§ããè¯ããã©ãŒã ãæ§ç¯ãã
useFormStatus
ããã¯ã¯ãReactã¢ããªã±ãŒã·ã§ã³ã§ãã©ãŒã éä¿¡ç¶æ
ã管çããããã®è²ŽéãªããŒã«ã§ããéä¿¡ã¹ããŒã¿ã¹ã远跡ããããã®ã¯ãªãŒã³ã§å®£èšçãªæ¹æ³ãæäŸããããšã§ãéçºè
ã¯ãããŠãŒã¶ãŒãã¬ã³ããªãŒã§å¿çæ§ãé«ããã¢ã¯ã»ã¹ãããããã©ãŒã ãäœæã§ããŸãããã®ã¬ã€ãã§ã¯ãããã¯ã®å
æ¬çãªæŠèŠãæäŸããå®è·µçãªäŸãã°ããŒãã«ãªãã¹ããã©ã¯ãã£ã¹ãããã³ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®å
ç¢ã§å¹ççãªãã©ãŒã ãæ§ç¯ããã®ã«åœ¹ç«ã€é«åºŠãªãã¯ããã¯ãå«ãŸããŠããŸãã
ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæ éã«èæ ®ããæç¢ºãªèŠèŠçåå³ãå®è£ ãã广çãªãšã©ãŒåŠçãçµã¿èŸŒãããšã§ãå¿«é©ã«äœ¿çšã§ããã¢ããªã±ãŒã·ã§ã³å šäœã®æåã«è²¢ç®ãããã©ãŒã ãäœæã§ããŸãã鲿ã«å¿ããŠãåœéåãããŒã«ãªãŒãŒã·ã§ã³ãã¢ã¯ã»ã·ããªãã£ã«ã€ããŠèããããšãå¿ããªãã§ãã ããããããã®æé ã«åŸãããšã§ãããè¯ããã©ãŒã ãæ§ç¯ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠããæåãããŠã§ãã¢ããªã±ãŒã·ã§ã³ãäœæããã®ã«åœ¹ç«ã¡ãŸãã