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 הזה.