React.isValidElement
проверяет true как для компонентов React, так и для элементов React. Как я могу проверить, в частности, что объект является компонентом React? В настоящее время я делаю это, тестируя typeof obj.type === 'function'
, но я надеюсь, что там будет лучший способ.
Как определить компонент React и элемент React?
Ответ 1
ReactComponent.prototype.isReactComponent = {};
33 из / node_modules/react/lib/ReactComponent.js
Установите с помощью npm. На данный момент нет прямого метода для проверки его действительности. То, что вы делаете, является правильным.
Ответ 2
Если вы действительно хотите ввести проверку для
-
компонент vs элемент
-
класс vs функциональный компонент
-
DOM vs Composite Element
Вы можете попробовать что-то вроде этого.
function isClassComponent(component) {
return (
typeof component === 'function' &&
!!component.prototype.isReactComponent
) ? true : false
}
function isFunctionComponent(component) {
return (
typeof component === 'function' &&
String(component).includes('return React.createElement')
) ? true : false;
}
function isReactComponent(component) {
return (
isClassComponent(component) ||
isFunctionComponent(component)
) ? true : false;
}
function isElement(element) {
return React.isValidElement(element);
}
function isDOMTypeElement(element) {
return isElement(element) && typeof element.type === 'string';
}
function isCompositeTypeElement(element) {
return isElement(element) && typeof element.type === 'function';
}
USE
// CLASS BASED COMPONENT
class Foo extends React.Component {
render(){
return <h1>Hello</h1>;
}
}
const foo = <Foo />;
//FUNCTIONAL COMPONENT
function Bar (props) { return <h1>World</h1> }
const bar = <Bar />;
// REACT ELEMENT
const header = <h1>Title</h1>;
// CHECK
isReactComponent(Foo); // true
isClassComponent(Foo); // true
isFunctionComponent(Foo); // false
isElement(Foo); // false
isReactComponent(<Foo />) // false
isElement(<Foo />) // true
isDOMTypeElement(<Foo />) // false
isCompositeTypeElement(<Foo />) // true
isReactComponent(Bar); // true
isClassComponent(Bar); // false
isFunctionComponent(Bar); // true
isElement(Bar); // false
isReactComponent(<Bar />) // false
isElement(<Bar />) // true
isDOMTypeElement(<Bar />) // false
isCompositeTypeElement(<Bar />) // true
isReactComponent(header); // false
isElement(header); // true
isDOMTypeElement(header) // true
isCompositeTypeElement(header) // false
Ответ 3
В дополнение к ответу @EmanualJade вы можете использовать это, чтобы проверить, является ли переменная function component
React.isValidElement(Component())
Как отметил @Leonardo, некоторые компиляторы могут привести к сбою:
String(component).includes('return React.createElement')
Ответ 4
class Test extends React.Component {}
console.log(!!Test.prototype.isReactComponent);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
Ответ 5
Самое простое решение:
React.isValidElement(element)
Ответ 6
Если вы хотите знать, какой у вас класс для конкретного экземпляра объектной переменной, то вам нужен оператор instanceof...
function isHTMLElement(obj) {
return (obj instanceof HTMLElement);
}
Я протестировал оба <someReactJSComponent/>
document.createElement('div')
(возвращает true) и <someReactJSComponent/>
(возвращает false).
instanceof
- мощный и полезный инструмент в JavaScript. Ознакомьтесь с официальной документацией по MDN: Mozilla Documentation Network: instanceof
"Оператор instanceof проверяет наличие constructor.prototype в цепочке прототипов объекта".
Кроме того, я загрузил пример кода с песочницей кода онлайн, чтобы продемонстрировать вышеупомянутый принцип...
Онлайн-код Песочница:
https://codesandbox.io/s/kmxjq27ol5
Код:
function App() { return (//insert JSX here//);};
const app = App();
const ele = document.createElement("div");
const rootElement = document.getElementById("root");
ReactDOM.render(app, rootElement);
console.log(
"Hello! Is a React Component HTML???" +
(app instanceof HTMLElement) +
"| Is an HTML element HTML???" +
(ele instanceof HTMLElement) +
"|"
);
Результаты кода:
Hello! Is a React Element HTML???false| Is an HTML element HTML???true|
Нет проблем (проверено Chrome и FF). Просто используйте instanceof
.