createElement
createElement מאפשרת ליצור React element. היא משמשת חלופה לכתיבת JSX.
const element = createElement(type, props, ...children)Reference
createElement(type, props, ...children)
קראו ל-createElement כדי ליצור React element עם type, props ו-children נתונים.
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello'
);
}Parameters
-
type: הארגומנטtypeחייב להיות סוג קומפוננטת React תקין. למשל, מחרוזת שם תגית (כמו'div'או'span'), או קומפוננטת React (פונקציה, class, או קומפוננטה מיוחדת כמוFragment). -
props: הארגומנטpropsחייב להיות אובייקט אוnull. אם תעבירוnull, הוא יטופל כמו אובייקט ריק. React תיצור element עם props תואמים ל-propsשהעברתם. שימו לב ש-refו-keyמתוך אובייקט ה-propsשלכם הם מיוחדים, ולכן לא יהיו זמינים כ-element.props.refו-element.props.keyעל ה-elementהמוחזר. הם יהיו זמינים כ-element.refו-element.key. -
אופציונלי
...children: אפס או יותר child nodes. הם יכולים להיות כל סוג של React nodes, כולל React elements, מחרוזות, מספרים, portals, nodes ריקים (null,undefined,true, ו-false), ומערכים של React nodes.
Returns
createElement מחזירה אובייקט React element עם כמה מאפיינים:
type: ה-typeשהעברתם.props: ה-propsשהעברתם, למעטrefו-key. אםtypeהיא קומפוננטה עם legacytype.defaultProps, אז כלpropsחסרים אוundefinedיקבלו את הערכים מתוךtype.defaultProps.ref: ה-refשהעברתם. אם חסר,null.key: ה-keyשהעברתם, מומר למחרוזת. אם חסר,null.
בדרך כלל תחזירו את ה-element מהקומפוננטה שלכם או תהפכו אותו ל-child של element אחר. למרות שאפשר לקרוא את מאפייני ה-element, עדיף להתייחס לכל element כלא שקוף אחרי יצירתו ורק לרנדר אותו.
Caveats
-
צריך להתייחס ל-React elements ול-props שלהם כ-immutable ולעולם לא לשנות את התוכן שלהם אחרי יצירה. בזמן פיתוח, React תבצע freeze רדוד ל-element המוחזר ולמאפיין
propsשלו כדי לאכוף זאת. -
כשמשתמשים ב-JSX, חייבים להתחיל תגית באות גדולה כדי לרנדר custom component. כלומר,
<Something />שקול ל-createElement(Something), אבל<something />(אותיות קטנות) שקול ל-createElement('something')(שימו לב שזו מחרוזת, ולכן תטופל כתגית HTML מובנית). -
כדאי להעביר children כארגומנטים מרובים ל-
createElementרק אם כולם ידועים סטטית, כמוcreateElement('h1', {}, child1, child2, child3). אם הילדים דינמיים, העבירו את כל המערך כארגומנט שלישי:createElement('ul', {}, listItems). כך React תוכל להזהיר עלkeys חסרים עבור רשימות דינמיות. לרשימות סטטיות אין צורך בכך כי הן לא משנות סדר.
שימוש
יצירת element בלי JSX
אם אתם לא אוהבים JSX או לא יכולים להשתמש בה בפרויקט, אפשר להשתמש ב-createElement כחלופה.
כדי ליצור element בלי JSX, קראו ל-createElement עם type, props, ו-children:
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello ',
createElement('i', null, name),
'. Welcome!'
);
}ה-children אופציונליים, ואפשר להעביר כמה שצריך (בדוגמה למעלה יש שלושה 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
Element הוא תיאור קל משקל של חלק מממשק המשתמש. למשל, גם <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 מה לעשות בהמשך.
יצירת elements היא פעולה זולה מאוד, כך שאין צורך לנסות לבצע לה אופטימיזציה או להימנע ממנה.