createElement() и cloneElement() - это два метода, используемые в React для создания элементов (elements) и клонирования элементов соответственно. Они имеют некоторые различия в своей работе.
createElement()
createElement() - это метод, который создает новый элемент React с указанным типом, свойствами и дочерними элементами. Все элементы, созданные с помощью createElement(), являются неизменяемыми immutable, что означает, что после создания элемента его свойства и дочерние элементы не могут быть изменены.
const element = createElement(type, props, ...children)-
type: Аргументtypeдолжен быть допустимым типом компонента React. Например, это может быть строка имени тега (например,'div'или'span') или компонент React (функция, класс или специальный компонент типаFragment). -
props: Аргументpropsдолжен быть либо объектом, либоnull. Если вы передадитеnull, он будет рассматриваться так же, как пустой объект. React создаст элемент с пропсами, соответствующими переданным вамиprops. Обратите внимание, чтоrefиkeyиз вашего объектаpropsявляются специальными и не будут доступны какelement.props.refиelement.props.keyв возвращаемомelement. Они будут доступны какelement.refиelement.key. -
опционально
...children: Ноль или более дочерних узлов. Это могут быть любые узлы React, включая элементы React, строки, числа, порталы, пустые узлы (null,undefined,trueиfalse) и массивы узлов React.
Например, чтобы создать элемент div с классом my-class и текстом Hello, world!, мы можем использовать метод createElement() следующим образом:
const element = React.createElement("div", { className: "my-class" }, "Hello, world!")cloneElement()
cloneElement() - это метод, который клонирует существующий элемент React и возвращает новый элемент с обновленными свойствами и/или дочерними элементами. Клонированный элемент может быть изменен, так как он не является неизменяемым, как элементы, созданные с помощью createElement().
const clonedElement = cloneElement(element, props, ...children)Например, чтобы клонировать элемент element и добавить ему новый класс new-class, мы можем использовать метод cloneElement() следующим образом:
const newElement = React.cloneElement(element, { className: "new-class" })Здесь мы передаем element и новый объект свойств { className: 'new-class' } в cloneElement(), который возвращает новый элемент с обновленным классом.
**Для чего используется cloneElement() ?
Чтобы переопределить пропсы некоторого реактивного элемента, передайте его в cloneElement с пропсами, которые вы хотите переопределить:
import { cloneElement } from "react"
// ...
const clonedElement = cloneElement(<Row title="Cabbage" />, { isHighlighted: true })Здесь результирующим клонированным элементом будет <Row title="Cabbage" isHighlighted={true} />.
Разница между createElement() и cloneElement()
Основная разница между createElement() и cloneElement() заключается в том, что createElement() создает новый элемент, а cloneElement() клонирует существующий элемент. Кроме того, элементы, созданные с помощью createElement(), являются неизменяемыми, а элементы, клонированные с помощью cloneElement(), могут быть изменены.
| Метод | Описание |
|---|---|
| createElement | Это код, в который компилируется JSX. Используется React для создания элементов и передачи им новых свойств. Этот метод используется для описания того, как выглядит пользовательский интерфейс. Аргументы: type, props, children. Создает и возвращает новый элемент с типом, указанным в аргументах. |
| cloneElement | Используется для клонирования элементов. Этот метод используется для манипуляции элементами. Аргументы: element, props, children. Клонирует и возвращает новый элемент с свойствами, переданными в аргументах. |
React.isValidElement(object)
React.isValidElement(object) — проверяет, что объект является элементом React. Возвращает true в случае если объект является элементом React или false в случае если он не является элементом React.
const A = <p>Some text</p>;
const B = {};
if (React.isValidElement(A))
console.info("A is React Element");
if (React.isValidElement(B))
console.info("B is React Element");
else
console.error("B is not a React Element");
// Output
A is React Element
B is not a React Element