React.isValidElement
对React组件以及React元素都进行测试。我将如何测试,具体来说,一个对象是一个React组件?目前,我正在测试typeof obj.type === 'function'
,但我希望有更好的方法。如何检测React组件与React元素?
19
A
回答
6
ReactComponent.prototype.isReactComponent = {};
/node_modules/react/lib/ReactComponent.js
33安装使用NPM。此时,没有可用的直接方法来检查其有效性。你在做什么是正确的。
17
如果你真的想VS元素
组件类型检查
类VS功能组件
DOM VS复合元素
你可以试试像这样的东西。
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';
}
使用
// 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
2
除了@EmanualJade答案,你可以用它来检查,如果一个变量是一个function component
React.isValidElement(Component())
正如@莱昂纳多指出,一些编译器可能会导致此失败:
String(component).includes('return React.createElement')
相关问题
- 1. react-native本机元素检测
- 2. 如何检查Dom元素或React组件
- 3. React Native - 如何检查UI /元素?
- 4. React组件丢失道具元素
- 5. 将DOM元素插入React组件
- 6. 如何渲染一个JSX元素(React组件)数组
- 7. 如何测试私人React组件
- 8. React /酶:如何测试子组件?
- 9. 如何测试React组件propTypes验证
- 10. 如何检测哪个React组件触发onKeyUp事件?
- 11. 如何与React组件共享属性?
- 12. 元素类型与React-Native中的youtube组件无效错误
- 13. 在与其他元素相同的行上显示React组件
- 14. 如何将React元素嵌入到组件中?
- 15. 如何将嵌套的React组件解析为元素树?
- 16. 如何在Semantic UI + React Dropdown组件中插入标签元素?
- 17. 如何访问React组件中渲染的元素文本?
- 18. 如何单元测试React组件shouldComponentUpdate方法
- 19. 如何为ES6类React组件创建Chai/Mocha单元测试?
- 20. 如何正确(单元)测试Om/React组件?
- 21. 在Meteor + React中,我如何在父React组件中渲染子React组件?
- 22. React组件如何触发兄弟React组件的功能
- 23. 如何替换React组件
- 24. react:如何构造组件
- 25. react-native redux - reducer改变数组元素
- 26. 如果在React JSX中未检测到闪存,我该如何隐藏元素
- 27. React组件测试。摩卡,酵素测试。错误
- 28. 如何测试TextField材质UI元素白色React Jest?
- 29. React中的类型检测
- 30. React Typescript元素类型
该帖子似乎缺少任何解释为什么您发布代码以及代码如何使用。这使得它从SO标准中获得低质量的答案。 –
@AlexeiLevenkov好点。更新 –
我猜isFunctionComponent的情况已经无效了。通过检查,我发现像这样的函数FnChild(道具){_react2.default.createElement('div',{id:'child-fn'}); }' – Leonardo