React.isValidElement
测试对 React 组件和 React 元素都为真。我将如何测试,具体来说,一个对象是一个 React 组件?目前,我正在通过测试来做到这一点typeof obj.type === 'function'
,但我希望有更好的方法。
如何检测 React 组件与 React 元素?
IT技术
javascript
reactjs
2021-03-09 13:29:19
6个回答
如果你真的想输入检查
组件与元素
类与功能组件
DOM 与复合元素
你可以尝试这样的事情。
function isClassComponent(component) {
return (
typeof component === 'function' &&
!!component.prototype.isReactComponent
)
}
function isFunctionComponent(component) {
return (
typeof component === 'function' &&
String(component).includes('return React.createElement')
)
}
function isReactComponent(component) {
return (
isClassComponent(component) ||
isFunctionComponent(component)
)
}
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';
}
利用
// 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
最简单的解决方案是:
React.isValidElement(element)
除了@EmanualJade 答案之外,您还可以使用它来检查变量是否为 function component
React.isValidElement(Component())
正如@Leonardo 指出的那样,某些编译器可能会导致此失败:
String(component).includes('return React.createElement')
ReactComponent.prototype.isReactComponent = {};
33 /node_modules/react/lib/ReactComponent.js
使用 npm 安装。在这一点上,没有可用于检查其有效性的直接方法。你在做什么是正确的。
这是一个古老的问题,有一个古老的答案。
如果您遇到此问题,您可能需要查看react-is
NPM 包页面:https : //www.npmjs.com/package/react-is
这是一个官方的 React module,它考虑了诸如 ref 转发之类的细节,以及检查元素类型的备忘录。
要检查值是否为元素类型,请执行以下操作: ReactIs.isValidElementType(obj)
其它你可能感兴趣的问题