2017-02-24 55 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