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-компонент (функція, клас або спеціальний компонент, якFragment
).props
: Аргументprops
має бути об'єктом абоnull
. Якщо ви передастеnull
, він буде оброблений так само, як порожній об'єкт. React створить елемент з пропсами, що відповідають переданому вамиprops
. Зверніть увагу, щоref
іkey
з вашого об'єктаprops
є спеціальними і не будуть доступні якelement.props.ref
таelement.props.key
у повернутомуелементі
. Вони будуть доступні якelement.ref
таelement.key
.за бажанням
...children
: Нуль або більше дочірніх вузлів. Це можуть бути будь-які вузли React, включаючи React-елементи, рядки, числа, портали, порожні вузли (null
),undefined
,true
таfalse
) та масиви React-вузлів.
Повернення
createElement
повертає об'єкт React-елемента з декількома властивостями:
тип
:тип
ви пройшли.props
: Ви передалиprops
, крімref
таkey
. Якщоtype
є компонентом із застарілимtype.defaultProps
, то будь-які відсутні або невизначеніprops
отримають значення зtype.defaultProps
.ref
: Переданий вамиref
. Якщо відсутній,null
.ключ
: Переданий вамиключ
примусово перетворюється на рядок. Якщо відсутній, тодіnull
.
Зазвичай, ви повертаєте елемент зі свого компонента або робите його дочірнім елементом іншого елемента. Хоча ви можете прочитати властивості елемента, найкраще вважати кожен елемент непрозорим після його створення і лише відрендерити його.
Застереження
Ви повинні розглядати React-елементи та їх пропси як незмінні і ніколи не змінювати їх вміст після створення. Під час розробки React буде заморожувати повернутий елемент та його
властивість props
, щоб забезпечити це.Коли ви використовуєте JSX, ви повинні починати тег з великої літери, щоб рендерити власний кастомний компонент. Іншими словами,
<Something />
еквівалентноcreateElement(Something)
, а<something />
(мала літера) еквівалентноcreateElement('something')
(зауважте, що це рядок, тому його буде розглянуто як вбудований тег HTML).Вам слід передавати дочірні елементи як декілька аргументів до
createElement
, якщо всі вони є статично відомими, наприкладcreateElement('h1', {}, child1, child2, child3)
. Якщо ваші дочірні елементи динамічні, передайте весь масив як третій аргумент:createElement('ul', {}, listItems)
. Це гарантує, що React попередить вас про відсутністьkey
s для будь-яких динамічних списків. Для статичних списків це не потрібно, оскільки вони ніколи не змінюють порядок.
Використання
Створення елемента без JSX
Якщо вам не подобається JSX або ви не можете використовувати його у вашому проекті, ви можете використовувати createElement
як альтернативу.
Щоб створити елемент без JSX, викличте Щоб відрендерити власний React-компонент, передайте функцію на кшталт У JSX це виглядало б так: Ось повний приклад, написаний за допомогою createElement
з деяким {name}</i>. Welcome!"], [1, 5, "h1"]]" class="language-js">function Greeting({ name }) {
return (
<h1 className="greeting">
Hello <i>{name}</i>. Welcome!
</h1>
);
}
Greeting
як export default function App() {
return createElement(Greeting, { name: 'Taylor' });
}
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' }
);
}
.greeting {
color: darkgreen;
font-family: Georgia;
}
А ось той самий приклад, написаний з використанням JSX:
function Greeting({ name }) {
return (
<h1 className="greeting">
Hello <i>{name}</i>. Welcome!
</h1>
);
}
export default function App() {
return <Greeting name="Taylor" />;
}
.greeting {
color: darkgreen;
font-family: Georgia;
}
Обидва стилі кодування є прийнятними, тому ви можете використовувати будь-який з них для вашого проекту. Основною перевагою використання JSX порівняно з createElement
є те, що легко побачити, який закриваючий тег відповідає відкриваючому тегу.
Що таке React-елемент?
Елемент - це полегшений опис частини інтерфейсу користувача. Наприклад, і <Greeting name="Taylor" />
, і createElement(Greeting, { name: 'Taylor' })
створюють об'єкт, подібний до цього:
// Slightly simplified
{
type: Greeting,
props: {
name: 'Taylor'
},
key: null,
ref: null,
}
Зауважте, що створення цього об'єкта не призводить до рендерингу компонента Greeting
або створення будь-яких елементів DOM.
Елемент React більше схожий на опис - інструкцію для React, щоб пізніше відрендерити компонент Greeting
. Повертаючи цей об'єкт з вашого компонента App
, ви вказуєте React, що робити далі.
Створення елементів є надзвичайно простим, тому вам не потрібно намагатися його оптимізувати або уникати.