Fragments
תבנית נפוצה ב-React עבור קומפוננטה שמחזירה אלמנטים מרובים. Fragments נותנים לך לאחד רשימה של ילדים מבלי להוסיף nodes נוספים ל-DOM.
render() {
return (
<React.Fragment>
<ChildA />
<ChildB />
<ChildC />
</React.Fragment>
);
}קיים גם תחביר קצר להצהרתם, אבל זה עדיין לא נתמך בידי כלים פופולאריים.
מוטיבציה
תבנית נפוצה עבור קומפוננטה שמחזירה רשימה של ילדים. קח לדוגמא את הקטע הזה של React:
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}<Columns /> יצטרך להחזיר אלמנטים <td> מרובים כדי שהרנדור של ה-HTML יהיה חוקי. אם ה-div ישמש כהורה ב-render() של <Columns />, אז התוצאה של ה-HTML תהיה אינה חוקית.
class Columns extends React.Component {
render() {
return (
<div>
<td>Hello</td>
<td>World</td>
</div>
);
}
}התוצאה בפלט של ה-<Table />:
<table>
<tr>
<div>
<td>Hello</td>
<td>World</td>
</div>
</tr>
</table>Fragments פותרים את הבעיה הזו.
שימוש
class Columns extends React.Component {
render() {
return (
<React.Fragment> <td>Hello</td>
<td>World</td>
</React.Fragment> );
}
}מה שמביא את <Table /> לפלט תקין.
<table>
<tr>
<td>Hello</td>
<td>World</td>
</tr>
</table>תחביר קצר
קיים תחביר חדש וקצר יותר שתוכל להשתמש בו להצהרת fragments. הוא נראה כמו תגיות ריקות.
class Columns extends React.Component {
render() {
return (
<> <td>Hello</td>
<td>World</td>
</> );
}
}אתה יכול להשתמש <></> באותו אופן שהשתמשת בכל אלמנט אחר, אך הוא אינו תומך ב-keys או תכונות.
Keyed Fragments
Fragments מוצהר <React.Fragment> עם התחבר המפורש יכול להכיר keys. מקרה שימושי הוא כאשר ממפים אוסף למערך של fragments - לדוגמא, ליצירת רשימה של תיאור.
function Glossary(props) {
return (
<dl>
{props.items.map(item => (
// Without the `key`, React will fire a key warning
<React.Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</React.Fragment>
))}
</dl>
);
}key הוא התכונה היחידה שאפשר להעביר ל-Fragment, בעתיד, אנו נוסיף תמיכה לתכונות נוספות, כגון event handlers.
דוגמא חיה
אתה יכול לנסות את התחביר החדש של ה-JSX fragment עם CodePen הזה.