createElement
createElement להצליח ליצור אלמנט React. היא משמשת חלופה לכתיבת JSX.
const element = createElement(type, props, ...children)הפניה
createElement(type, props, ...children)
קראו ל-createElement כדי ליצור אלמנט React עם נתונים type, props ו-children.
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello'
);
}פרמטרים
-
type: הארגומנטtypeחייב להיות סוג קומפונטת React תקין. למשל, מחרוזת שם תגית (כמו'div'או'span'), או קומפונטת React (פונקציה, class, או קומפונטה מיוחדת כמוFragment). -
props: הארגומנטpropsחייב להיות אובייקט אוnull. אם תעבירוnull, הוא יטופל כמו ריק. React תיצור אלמנט עם props תואמים ל-propsשהעברתם. שימו לב ש-refו-keyמתוך אובייקט ה-propsשלכם הם מיוחדים, אז לא יהיו זמינים כ-element.props.refו-element.props.keyעל ה-elementהמוחזר. הם יהיו זמינים כ-element.refו-element.key. -
אופציונלי
...children: אפס או יותר צמתים ילדים. הם יכולים להיות כל סוג של React צמתים, כולל React אלמנטים, מחרוזות, מספרים, פורטלים, צמתים ריקים (null,undefined,true, ו-false), וערכים של __T.
מחזירה
createElement מחזירה אובייקט React אלמנט עם כמה מאפיינים:
type: ה-typeהעברתם.props: ה-propsהעברתם, למעטrefו-key. אםtypeהיא קומפוננטה עם legacytype.defaultProps, אז כלpropsחסרים אוundefinedיקבלו את הערכים מתוךtype.defaultProps.ref: ה-refהעברתם. אם חסר,null.key: ה-keyהעברתם, מומר למחרוזת. אם חסר,null.
בדרך כלל תחזירו את ה-element מהקומפוננטה שלכם או תהפכו אותו ל-child של אלמנט אחר. אם אפשר לקרוא את מאפייני ה-element, עדיף להתייחס לכל האלמנט כלא שקוף אחרי יצירתו ורק לרנדר אותו.
אזהרות
-
צריך להתייחס ל-React elements ול-props שלהם כ-בלתי ניתן לשינוי ולעולם לא לשנות את התוכן שלהם אחרי יצירה. בזמן פיתוח, React תבצע freeze רדוד ל-אלמנט המוחזר ולכומאפיין
propsזאת שלו. -
כשמשתמשים ב-JSX, חייבים להתחיל תגית באות גדולה כדי לרנדר רכיב מותאם אישית. כלומר,
<Something />שקול ל-createElement(Something), אבל<something />(אותיות קטנות) שקול ל-createElement('something')(שימו לבש מחרוזת, כך תטופל כתגי__ת __T). -
כדאי להעביר ילדים כארגומנטים מרובים ל-
createElementרק אם ידועים סטטיים, כמוcreateElement('h1', {}, child1, child2, child3). אם הילדים דינמיים, העבירו את כל המערך כארגומנט שלישי:createElement('ul', {}, listItems). כך React תוכל להזהיר עלkeys חסרים עבור רשימות דינמיות. לרשימות סטטיות אין צורך כי הן לא משנות סדר.
שימוש
יצירת אלמנט בלי JSX
אם אתם לא אוהבים JSX או לא יכולים להשתמש בה בפרויקט, אפשר להשתמש ב-createElement כחלופה.
כדי ליצור אלמנט בלי JSX, קראו ל-createElement עם סוג, props, ו-ילדים:
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello ',
createElement('i', null, name),
'. Welcome!'
);
}ה-children אופציונליים, ואפשר להעביר כמה דברים (בדוגמה למעלה יש שלושה ילדים). הקוד הזה יציג כותרת <h1> עם ברכה. להשוואה, הנה אותה דוגמה שנכתבה עם JSX:
function Greeting({ name }) {
return (
<h1 className="greeting">
Hello <i>{name}</i>. Welcome!
</h1>
);
}כדי לרנדר קומפוננתת React משלכם, העבירו פונקציה כמו Greeting כ-type במקום מחרוזת כמו 'h1':
export default function App() {
return createElement(Greeting, { name: 'Taylor' });
}עם JSX זה היה נראה כך:
export default function App() {
return <Greeting name="Taylor" />;
}הנה דוגמה מלאה שנכתבה עם createElement:
import { createElement } from 'react'; function Greeting({ name }) { return createElement( 'h1', { className: 'greeting' }, 'Hello ', createElement('i', null, name), '. Welcome!' ); } export default function App() { return createElement( Greeting, { name: 'Taylor' } ); }
והנה אותה דוגמה כשהיא כתובה עם JSX:
function Greeting({ name }) { return ( <h1 className="greeting"> Hello <i>{name}</i>. Welcome! </h1> ); } export default function App() { return <Greeting name="Taylor" />; }
שני סגנונות הקוד תקינים, ואפשר להשתמש במה מתאים לפרויקט שלכם. זהו המרכזי של JSX לעומת createElement הוא שקל לראות איזו תגית סוגרת שייכת לאיזו תגית פותחת.
Deep Dive
האלמנט הוא תיאור קל משקל של חלק מממשק המשתמש. למשל, גם <Greeting name="Taylor" /> וגם createElement(Greeting, { name: 'Taylor' }) מייצרים אובייקט כזה:
// Slightly simplified
{
type: Greeting,
props: {
name: 'Taylor'
},
key: null,
ref: null,
}שימו לב שיצירת האובייקט הזה לא מרנדרת את הקומפוננטה Greeting ולא יוצרת אלמנטים ב-DOM.
React element דומה יותר לתיאור - הוראה ל-React לרנדר מאוחר יותר את הקומפוננטה Greeting. על ידי החזרת האובייקט הזה מקומפונטת App, אתם אומרים ל-React מה לעשות בהמשך.
פעולות יצירתיות זולה מאוד, כך שאין צורך לנסות לבצע לה אופטימיזציה או כוח ממנה.