React Fragmentsã®å æ¬çãªã¬ã€ãããã®äœ¿ãæ¹ãå©ç¹ããããŠããã¯ãªãŒã³ã§å¹ççãªã³ã³ããŒãã³ãã®ããã®æ§ã ãªæ»ããã¿ãŒã³ãæãäžããŸãã
React Fragments: è€æ°èŠçŽ ã®æ»ããã¿ãŒã³ã極ãã
Reactã§ã¯ãã³ã³ããŒãã³ãã¯åäžã®ã«ãŒãèŠçŽ ãã¬ã³ããªã³ã°ããããã«èšèšãããŠããŸãããã®åºæ¬çãªã«ãŒã«ã¯ãã³ã³ããŒãã³ãããè€æ°ã®èŠçŽ ãè¿ãããå Žåã«ãã°ãã°èª²é¡ãšãªããŸããåŸæ¥ãéçºè
ã¯ãããã®èŠçŽ ã<div>ã§å²ãããšã«é Œã£ãŠããŸããããããããã®æ¹æ³ã¯DOMã«äžèŠãªããŒããå°å
¥ããããã©ãŒãã³ã¹ã«åœ±é¿ãäžããããã¹ã¿ã€ãªã³ã°ãè€éã«ãããããå¯èœæ§ããããŸããReact Fragmentsã¯ãDOMã«äœåãªããŒãã远å ããããšãªããåèŠçŽ ã®ãªã¹ããã°ã«ãŒãåã§ããããã®åé¡ã«å¯Ÿãããšã¬ã¬ã³ããªè§£æ±ºçãæäŸããŸãã
React Fragmentsãšã¯ïŒ
React Fragmentsã¯ãReact 16.2ã§å°å ¥ãããæ©èœã§ãäœåãªDOMããŒããå°å ¥ããããšãªããã³ã³ããŒãã³ãããè€æ°ã®èŠçŽ ãè¿ãããšãã§ããŸãããããã¯ç®ã«èŠããªãã©ãããŒãšããŠæ©èœããHTMLæ§é ã«åœ±é¿ãäžããããšãªãèŠçŽ ã广çã«ã°ã«ãŒãåããŸããããã«ãããDOMæ§é ãããã¯ãªãŒã³ã«ãªããããã©ãŒãã³ã¹ãåäžããã¹ã¿ã€ãªã³ã°ã容æã«ãªããŸãã
React Fragmentsã䜿çšããçç±
- ããã¯ãªãŒã³ãªDOM: äžèŠãª
<div>ã©ãããŒãåé¿ããããã¯ãªãŒã³ã§ã»ãã³ãã£ãã¯ãªDOMæ§é ããããããŸãã - ããã©ãŒãã³ã¹ã®åäž: DOMããŒãã®æ°ãæžããããšã§ãç¹ã«è€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããŠããã©ãŒãã³ã¹ã®æ¹åã«ã€ãªããå¯èœæ§ããããŸãã
- ã¹ã¿ã€ãªã³ã°ã®ç°¡çŽ å: äœåãªã©ãããŒèŠçŽ ãé¿ããããšã§ãã¹ã¿ã€ã«ã®ç«¶åãé²ããã¹ã¿ã€ã«ãæ£ããé©çšãããããªããŸãã
- æå¹ãªHTML: ç¹ã«è€æ°ã®ãããã¬ãã«èŠçŽ ïŒäŸ:
<tbody>å ã®ããŒãã«è¡ïŒãè¿ãå¿ èŠãããã³ã³ããŒãã³ããæ±ãéã«ãæå¹ãªHTMLæ§é ãç¶æããã®ã«åœ¹ç«ã¡ãŸãã
React Fragmentsã®ããŸããŸãªäœ¿ç𿹿³
Reactã¯ãFragmentãå®è£ ããããã®ããã€ãã®æ¹æ³ãæäŸããŠãããããããç¬èªã®æ§æãšãŠãŒã¹ã±ãŒã¹ããããŸãã
1. æç€ºçãªReact.Fragmentæ§æ
Fragmentã䜿çšããæãæç€ºçãªæ¹æ³ã¯ãReactãªããžã§ã¯ããã€ã³ããŒãããReact.Fragmentã³ã³ããŒãã³ãã䜿çšããããšã§ãã
import React from 'react';
function MyComponent() {
return (
<React.Fragment>
<h1>Hello, world!</h1>
<p>This is a fragment example.</p>
</React.Fragment>
);
}
export default MyComponent;
ãã®ã¢ãããŒãã¯æç¢ºã§èªã¿ããããåå¿è ãæç€ºæ§ã奜ãŸããå Žåã«é©ããŠããŸãã
2. ççž®æ§æïŒ<></>ïŒ
Reactã¯ã空ã®ã¿ã°ïŒ<></>ïŒã䜿çšããFragmentã®ççž®æ§æãæäŸããŠããŸããããã¯ããç°¡æœã§ãFragmentã䜿çšããéã«ãã奜ãŸããæ¹æ³ã§ãã
function MyComponent() {
return (
<>
<h1>Hello, world!</h1>
<p>This is a fragment example.</p>
</>
);
}
ãã®æ§æã¯ããçãã¯ãªãŒã³ã§ãç°¡æœããéèŠãããç¶æ³ã«æé©ã§ãããã ãããã®æ§æã¯ããŒã屿§ãFragmentã«çŽæ¥æž¡ãããšããµããŒãããŠããªãç¹ã«æ³šæãå¿
èŠã§ããããŒã屿§ã䜿çšããå¿
èŠãããå Žåã¯ãæç€ºçãªReact.Fragmentæ§æã䜿çšããå¿
èŠããããŸãã
3. Fragmentã§ã®ããŒã®äœ¿çš
Fragmentã䜿çšããŠèŠçŽ ã®ãªã¹ããã¬ã³ããªã³ã°ããå ŽåãåèŠçŽ ã«ããŒãæäŸããå¿
èŠãããå ŽåããããŸããããŒã¯ãReactãã©ã®é
ç®ã倿Žããããã远å ããããããŸãã¯åé€ãããããèå¥ããã®ã«åœ¹ç«ã¡ãŸããççž®æ§æã§ã¯ã`key` propãFragmentã«çŽæ¥æž¡ãããšã¯ã§ããŸããã代ããã«ãæç€ºçãªReact.Fragmentæ§æã䜿çšããå¿
èŠããããŸãã
import React from 'react';
function MyComponent(props) {
return (
<ul>
{props.items.map(item => (
<React.Fragment key={item.id}>
<li>{item.name}</li>
<li>{item.description}</li>
</React.Fragment>
))}
</ul>
);
}
export default MyComponent;
ãã®äŸã§ã¯ãé
ç®ã®ãªã¹ããã¬ã³ããªã³ã°ããŠãããåé
ç®ã¯é
ç®ã®IDããæŽŸçããäžæã®ããŒãæã€React.Fragmentã§å²ãŸããŠããŸããããã¯ãé
ç®ã倿Žããããšãã«Reactããªã¹ããå¹ççã«æŽæ°ããããã«äžå¯æ¬ ã§ãã
äžè¬çãªãŠãŒã¹ã±ãŒã¹ãšæ»ããã¿ãŒã³
Fragmentã¯å€çšéã§ãããReactã³ã³ããŒãã³ããæ¹åããããã®æ§ã ãªã·ããªãªã§äœ¿çšã§ããŸãã以äžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ãšæ»ããã¿ãŒã³ã瀺ããŸãã
1. è€æ°ã®ãããã¬ãã«èŠçŽ ãè¿ã
æãåºæ¬çãªãŠãŒã¹ã±ãŒã¹ã¯ãäœåãªã©ãããŒã远å ããã«è€æ°ã®èŠçŽ ãè¿ãããšã§ããããã¯ãDOMã«äžèŠãªããŒããå°å ¥ããããšãé¿ãããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
function MyComponent() {
return (
<>
<h1>Title</h1>
<p>Content here.</p>
</>
);
}
2. ããŒãã«è¡ã®ã¬ã³ããªã³ã°
<tbody>å
ã§ããŒãã«è¡ïŒ<tr>ïŒãã¬ã³ããªã³ã°ããå ŽåãFragmentã¯æå¹ãªHTMLãç¶æããããã«äžå¯æ¬ ã§ããè¡ã<div>ã©ãããŒã§å²ããšãããŒãã«æ§é ãå£ããŠããŸããŸãã
function MyTableBody(props) {
return (
<tbody>
{props.data.map(row => (
<React.Fragment key={row.id}>
<tr>
<td>{row.name}</td>
<td>{row.value}</td>
</tr>
</React.Fragment>
))}
</tbody>
);
}
3. ã¬ã€ã¢ãŠãã³ã³ããŒãã³ãã®äœæ
Fragmentã¯ãäœåãªDOMããŒããå°å ¥ããããšãªããã¢ããªã±ãŒã·ã§ã³ã®UIãæ§é åããã¬ã€ã¢ãŠãã³ã³ããŒãã³ããäœæããããã«äœ¿çšã§ããŸãã
function TwoColumnLayout(props) {
return (
<>
<div className=\"column left\">{props.left}</div>
<div className=\"column right\">{props.right}</div>
</>
);
}
4. æ¡ä»¶ä»ãèŠçŽ ã®ã¬ã³ããªã³ã°
Fragmentã¯æ¡ä»¶ä»ãã¬ã³ããªã³ã°ãšçµã¿åãããŠãç¹å®ã®æ¡ä»¶ã«åºã¥ããŠç°ãªãèŠçŽ ã衚瀺ããããšãã§ããŸããããããã¹ãŠäœåãªã©ãããŒãå°å ¥ããããšãªãå¯èœã§ãã
function MyComponent(props) {
return (
<>
{props.isLoading ? (
<p>Loading...</p>
) : (
<>
<h1>Data Loaded!</h1>
<p>Here is the data.</p>
</>
)}
</>
);
}
5. NullãŸãã¯Fragmentãè¿ã
æã«ã¯ãäœãæ¡ä»¶ä»ãã§ã¬ã³ããªã³ã°ããããªãå ŽåããããŸããç©ºã®æååã`undefined`ãè¿ã代ããã«ïŒãããã¯æã«åé¡ãåŒãèµ·ããããšããããŸãïŒã`null`ãŸãã¯ç©ºã®Fragmentãè¿ãã®ãããããåŠçããã¯ãªãŒã³ãªæ¹æ³ã§ãã
function MyComponent(props) {
if (!props.showContent) {
return null; // Or return <>;&n }
return (
<>
<h1>Content</h1>
<p>This content is only shown when showContent is true.</p>
</>
);
}
Fragmentã䜿çšããå©ç¹
Fragmentã䜿çšããå©ç¹ã¯ãããã¯ãªãŒã³ãªDOMæ§é ã«ãšã©ãŸããŸããããããã¯ãã³ãŒãå šäœã®ä¿å®æ§ãããã©ãŒãã³ã¹ãéçºè ãšã¯ã¹ããªãšã³ã¹ã«è²¢ç®ããŸãã
1. ããã©ãŒãã³ã¹ã®åäž
DOMããŒãã®æ°ãæžããããšã¯ãçŽæ¥çã«ããã©ãŒãã³ã¹ã®åäžã«ã€ãªãããŸãããã©ãŠã¶ã¯DOMã®ã¬ã³ããªã³ã°ãšæŽæ°ã«ãããäœæ¥ãå°ãªããªããããŒãžã®èªã¿èŸŒã¿æéã®ççž®ãšããã¹ã ãŒãºãªãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã«ã€ãªãããŸããå°ããªã³ã³ããŒãã³ãã§ã¯ããã©ãŒãã³ã¹ã®åäžã¯ããããããããããŸããããæ·±ããã¹ããããã³ã³ããŒãã³ããæã€è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯éèŠã«ãªãå¯èœæ§ããããŸãã
2. ã¹ã¿ã€ãªã³ã°ã®ç°¡çŽ å
äœåãªã©ãããŒèŠçŽ ãé¿ããããšã§ãã¹ã¿ã€ãªã³ã°ãç°¡çŽ åãããŸããäžèŠãª<div>èŠçŽ ã«ãã£ãŠåŒãèµ·ããããæå³ããªãã¹ã¿ã€ã«ã®ç¶æ¿ãç«¶åã«ã€ããŠå¿é
ããå¿
èŠããããŸãããããã«ãããã¹ã¿ã€ã«ãæ£ããé©çšããã¢ããªã±ãŒã·ã§ã³å
šäœã§äžè²«ããèŠèŠç衚çŸãç¶æããããšã容æã«ãªããŸãã
3. ããã¯ãªãŒã³ãªã³ãŒããšå¯èªæ§
Fragmentã¯ãããã¯ãªãŒã³ã§èªã¿ãããã³ãŒããä¿é²ããŸããäžèŠãªã©ãããŒèŠçŽ ããªãããšã§ãã³ã³ããŒãã³ãæ§é ãçè§£ãããããä¿å®ãããããªããŸããããã¯ãå ±åäœæ¥ãé·æçãªä¿å®æ§ã«ãããŠã³ãŒãã®æç¢ºããéåžžã«éèŠã§ããå€§èŠæš¡ãããžã§ã¯ãã«ãããŠç¹ã«éèŠã§ãã
4. ç¡å¹ãªHTMLã®é²æ¢
Fragmentã¯ãReactã³ã³ããŒãã³ããæå¹ãªHTMLãçæããã®ã«åœ¹ç«ã¡ãŸããããŒãã«èŠçŽ ã®ãããªç¹å®ã®HTMLæ§é ã¯ãç¹å®ã®èŠªåé¢ä¿ãå¿ èŠãšããŸããèš±å¯ãããŠããªãå Žæã§`div`ã䜿çšãããšHTMLãå£ããäºæããªãã¬ã³ããªã³ã°ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
å®è·µäŸ: ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³
Fragmentãã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã«é¢é£ããã·ããªãªã§ã©ã®ããã«é©çšã§ããããèŠãŠã¿ãŸãããã
1. å€èšèªå¯Ÿå¿
è€æ°ã®èšèªããµããŒããããŠã§ããµã€ããæ§ç¯ããŠãããšæ³åããŠã¿ãŠãã ãããããã¹ããããã¯ã®ç°ãªãããŒãžã§ã³ãæ¡ä»¶ä»ãã§ã¬ã³ããªã³ã°ããå¿ èŠããããããããŸãããFragmentã¯ãäœåãªDOMããŒãã远å ããããšãªããããå®çŸããã®ã«åœ¹ç«ã¡ãŸãã
import React from 'react';
function MultiLanguageText(props) {
const { language, translations } = props;
return (
<>
{translations[language] ? (
<p>{translations[language]}</p>
) : (
<p>{translations['en']}</p>
)}
</>
);
}
export default MultiLanguageText;
ãã®äŸã§ã¯ãã³ã³ããŒãã³ãã¯éžæãããèšèªã«åºã¥ããŠé©åãªç¿»èš³ãã¬ã³ããªã³ã°ããŸããçŸåšã®èšèªã®ç¿»èš³ãå©çšã§ããªãå Žåãããã©ã«ãã§è±èªã«èšå®ãããŸãã
2. åœéé»è©±çªå·ã®è¡šç€º
ç°ãªãåœã®é»è©±çªå·ã衚瀺ããå Žåãå°åã«åºã¥ããŠç°ãªã圢åŒã§è¡šç€ºããå¿ èŠããããããããŸãããFragmentã¯ãäœåãªã©ãããŒãå°å ¥ããããšãªããé»è©±çªå·ã³ã³ããŒãã³ããã°ã«ãŒãåããã®ã«åœ¹ç«ã¡ãŸãã
import React from 'react';
function PhoneNumber(props) {
const { countryCode, number } = props;
return (
<>
<span>+{countryCode}</span>
<span>{number}</span>
</>
);
}
export default PhoneNumber;
ãã®ã³ã³ããŒãã³ãã¯ãåœã³ãŒããšé»è©±çªå·ãå¥ã ã®ã¹ãã³ãšããŠè¡šç€ºããå°åã«åºã¥ããæè»ãªã¹ã¿ã€ãªã³ã°ãšæžåŒèšå®ãå¯èœã«ããŸãã
3. æ¥ä»ãšæå»ã®åœ¢åŒã®åŠç
ãŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠæ¥ä»ãšæå»ãç°ãªã圢åŒã§è¡šç€ºããããšã¯ãã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã§ããããèŠä»¶ã§ããFragmentã¯ãäœåãªDOMããŒãã远å ããããšãªããæ¥ä»ãšæå»ã®ã³ã³ããŒãã³ããæ§é åããã®ã«åœ¹ç«ã¡ãŸãã
import React from 'react';
import { DateTime } from 'luxon'; // Example using Luxon library
function FormattedDate(props) {
const { date, locale } = props;
const formattedDate = DateTime.fromISO(date).setLocale(locale).toLocaleString(DateTime.DATE_FULL);
return (
<>
<time dateTime={date}>{formattedDate}</time>
</>
);
}
export default FormattedDate;
ãã®ã³ã³ããŒãã³ãã¯ãLuxonã®ãããªã©ã€ãã©ãªã䜿çšããŠæ¥ä»ã®æžåŒèšå®ãåŠçããæå®ããããã±ãŒã«ã«åŸã£ãŠæ¥ä»ããã©ãŒãããããŸãã`time`èŠçŽ ã¯æ¥ä»ã«ã»ãã³ãã£ãã¯ãªæå³ãæäŸããŸãã
Fragmentã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
Fragmentã®å©ç¹ãæå€§éã«åŒãåºãããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- å¯èœãªéãççž®æ§æïŒ
<></>ïŒã䜿çšãã: ã³ãŒããããã¯ãªãŒã³ã§ç°¡æœã«ãªããŸãã - ããŒã屿§ãæäŸããå¿
èŠãããå Žåã¯ãæç€ºçãª
React.Fragmentæ§æã䜿çšãã: ããã¯èŠçŽ ã®ãªã¹ããã¬ã³ããªã³ã°ããéã«äžå¯æ¬ ã§ãã - äžèŠãªFragmentã¯é¿ãã: åäžã®èŠçŽ ãFragmentã§å²ãŸãªãã§ãã ãããè€æ°ã®èŠçŽ ãè¿ãå¿ èŠãããå Žåã«ã®ã¿äœ¿çšããŠãã ããã
- ã¬ã€ã¢ãŠãã³ã³ããŒãã³ãã§ã®Fragmentã®äœ¿çšãæ€èšãã: ããã«ãããããã¯ãªãŒã³ã§æè»ãªã¬ã€ã¢ãŠããäœæã§ããŸãã
- ããã©ãŒãã³ã¹ãžã®åœ±é¿ã«æ³šæãã: Fragmentã¯äžè¬çã«ããã©ãŒãã³ã¹ãåäžãããŸãããæ·±ããã¹ããããFragmentã®é床ã®äœ¿çšã¯ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŠãã ããã
React Fragmentsã®ä»£æ¿ææ®µ
Fragmentã¯éåžžãReactã§è€æ°ã®èŠçŽ ãè¿ãããã®æšå¥šãããã¢ãããŒãã§ãããç¹å®ã®ç¶æ³ã§ééãããæ€èšãããããå¯èœæ§ã®ãã代æ¿ã¢ãããŒãããããŸãã
1. èŠçŽ ã®é åãè¿ãïŒæšå¥šåºŠäœïŒ
æè¡çã«ã¯ãã³ã³ããŒãã³ãããReactèŠçŽ ã®é åãè¿ãããšã¯å¯èœã§ãããããããã®ã¢ãããŒãã«ã¯ããã€ãã®æ¬ ç¹ããããŸãã
- ããŒãå¿ èŠ: é åå ã®åèŠçŽ ã«ã¯ãäžæã®`key`ãããããå¿ é ã§ãã
- ã»ãã³ãã£ãã¯ã«å£ã: ã³ãŒããããè€æ°ã®èŠçŽ ãåäžã®è«çåäœãšããŠè¿ããŠããããšãããã«æç¢ºã«ãªããŸããã
- Reactã®æŽæ°ã«é¢ããæœåšçãªåé¡: Reactã¯ãèŠçŽ ã®é åãçŽæ¥æ±ãå ŽåãDOMãå¹ççã«æŽæ°ããã®ãããå°é£ã«ãªãå¯èœæ§ããããŸãã
ãããã®çç±ãããé åãè¿ãããšã¯äžè¬çã«Fragmentã«æ¯ã¹ãŠæšå¥šãããŸããã
2. <div>ã©ãããŒã®äœ¿çšïŒäžè¬çã«éæšå¥šïŒ
åè¿°ã®ãšãããèŠçŽ ã<div>ã§å²ãã®ã¯åŸæ¥ã®ïŒãããŠãã°ãã°åé¡ã®ããïŒã¢ãããŒãã§ããããã¯ãªãŒã³ãªDOMãããã©ãŒãã³ã¹ãã¹ã¿ã€ãªã³ã°ã®åé¡ãšãã£ãåè¿°ã®çç±ãããå¯èœãªéãé¿ããã¹ãã§ãã
çµè«
React Fragmentsã¯ãããã¯ãªãŒã³ã§å¹ççããããŠä¿å®ããããReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªããŒã«ã§ããäœåãªDOMããŒããå°å ¥ããããšãªãè€æ°ã®èŠçŽ ãè¿ãããšãå¯èœã«ããããšã§ãFragmentã¯ããã©ãŒãã³ã¹ãåäžãããã¹ã¿ã€ãªã³ã°ãç°¡çŽ åããããã¯ãªãŒã³ãªã³ãŒããä¿é²ããŸããå°ããªã³ã³ããŒãã³ããæ§ç¯ããå Žåã§ããè€éãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåã§ããFragmentã¯ããªãã®ReactããŒã«ãããã®äžéšã§ããã¹ãã§ããFragmentã®ããŸããŸãªäœ¿ç𿹿³ãç¿åŸãããã®å©ç¹ãçè§£ããããšã§ãããè¯ãReactã³ãŒããèšè¿°ããåªãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãçã¿åºãããšãã§ããŸãã
Reactã®åŠç¿ãé²ããã«ããããããŸããŸãªæ»ããã¿ãŒã³ã詊ããç¹å®ã®ããŒãºã«æé©ãªã¢ãããŒããéžæããããšãå¿ããªãã§ãã ãããããŸããŸãªã·ããªãªã§Fragmentãå®éšããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšæ§é ãžã®åœ±é¿ã芳å¯ããŠãã ãããHappy codingïŒ