2017-02-24 58 views
0

我有一个自定义的Todo propType:阵营嵌套自定义propType

export const TodoPropType = PropTypes.shape({ 
    title: PropTypes.string.isRequired, 
    description: PropTypes.string 
    }) 

我有我的待办事项的收集这样

{ 
"Kfd455gdf4gdf" : { // key as uid 
    title: "blabla", 
    description: "blobloblo" 
    }, 
    "Kf65sd465fsd" : { 
    title: "blabla2", 
    description: "blobloblo2" 
    } 
} 

我愿做一个自定义propType验证收集和重复使用我的待办事项propType

export const TodosPropType = function(props, propName, componentName) { 
    const todos = props[propName] 

// ... valide that an object.. 

    Object.keys(todos).map((qid) => { 

    // valide that the qid is a string 

    // reuse my TodoPropType 
    }) 
} 

但它不赞成手动调用PropType。我得到了一个警告:

警告:您手动呼吁todos道具上TodoComponement一个React.PropTypes验证功能。这是弃用的,将不会在生产与下一个主要版本....

你如何处理?

回答

0

不幸的是,由于该弃用,您需要使用typeof stringToCheck === 'string'并手动检查props.title是否存在。如果其中任何一个东西都丢失了,那么你会手动返回一个错误使用new Error('error goes here')

我们在我们的应用程序中有类似的thigns,并且从来没有做自定义验证为什么你不能做这样的事情。

component.propTypes = { 
    todos: PropTypes.objectOf(TodoPropType) 
} 

这将告知组件检查待办事项是一个数组,如果是数组的内容应该是给定的形状,如果任何不在于形状匹配,那么它会抛出一个错误。

+0

这是我在使用Firebase之前所做的。 他们不使用数组而是使用Object作为uid的键(正如我在帖子中所说的) 我需要的是一个propType,它验证它是一个带有一个或多个TodoPropType值的键字符串的对象。 – Titoine

+0

那么你应该看看'objectOf'这是你正在寻找。它基本上是'arrayOf',但是对于其键应该具有特定值的对象。 – finalfreq