假设以下代码:
TestComponent.propTypes = {
text: React.PropTypes.string,
myEnum: React.PropTypes.oneOf(['News', 'Photos'])
};
我在另一个文件(使用TestComponent)中执行了以下操作:
if (TestComponent.propTypes.text === React.PropTypes.string) {...}
if (TestComponent.propTypes.myEnum === React.PropTypes.oneOf) {...}
嗯,令我满意的是第一个如果有效的话。但第二个如果永远不会真实。我尝试将其修改为下面的语法,但它没有帮助。
if (TestComponent.propTypes.myEnum === React.PropTypes.oneOf(['News', 'Photos'])) {...}
所以,问题是:有什么机制可以发现道具的类型? 我知道React会针对propType测试prop的值来验证它。但是,我需要访问“预期类型”'以及做我的东西。
BTW,这里是React代码的摘录,用于验证propTypes(为简洁起见缩短):
function createPrimitiveTypeChecker(expectedType) {
function validate(props, propName, componentName, location, propFullName){
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== expectedType) {
// return some Error
}
return null;
}
return createChainableTypeChecker(validate);
}
正如您所看到的,外部函数的参数是expectedType。它用在内部验证函数中(if(propType!== expectedType))。但是,React不会将expectedType保存到成员变量中,以便外部代码可以访问它。那么外部代码如何计算出propType的类型
我的观点是不要验证'道具的具体价值。 React很好地处理了这个问题。我的观点是根据prop类型做一些特定的逻辑,我可以通过anyOf,objectOf,shape等类型来实现。
有什么想法,建议吗?
答案 0 :(得分:5)
简短的回答,你不能比较这些,因为它们指向不同的功能。当您致电oneOf
时,它会返回另一个功能。
解释:此处的问题是React.PropTypes.oneOf
是函数createEnumTypeChecker
。
而React.PropTypes.myEnum
将包含调用oneOf
函数的返回值 - 因为在propTypes
定义中您必须实际调用oneOf()
。
调用oneOf()
的结果是一个不同的函数,在createChainableTypeChecker()
内声明。
不幸的是,您的第二次尝试因为这些功能不同而无法工作,每次调用oneOf()
时都会创建它们。请参阅createChainableTypeChecker
ReactPropTypes.js
var chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
解决方案:我建议你测试一下这些功能的名称。这将证明这是一种有效的React Prop类型。
// returns false
React.PropTypes.oneOf(['myArr']) === React.PropTypes.oneOf(['myArr'])
// returns true
React.PropTypes.oneOf(['myArr']).name == React.PropTypes.oneOf(['myArr']).name
// this should return true in your case:
if ( TestComponent.propTypes.myEnum.name === React.PropTypes.oneOf().name )
不幸的是,所有非原始的React propTypes 都使用createChainableTypeChecker
,这总是会返回一个名为checkType
的函数。如果每个 propType 的名称不同,那么您将能够检查使用的类型。就像现在一样,您无法知道它是oneOf
,objectOf
还是其他任何一个,包括any
。