2016-02-12 1 views
1

J'essaie de spécifier les PropTypes pour un de mes composants React et j'ai rencontré des problèmes. L'objet que je suis en train de décrire va ressembler à ceci (le tableau contiendra plusieurs objets):Réagissez PropTypes - forme avec des nombres comme clés

rounds: { 
    1: [ 
     { 
     date: 1429354800000, 
     arena: 'Arena name', 
     scoreHome: 3, 
     scoreAway: 2, 
     teamHome: 'Home team name', 
     teamAway: 'Away team name', 
     spectators: 10 
     } 
    ] 
} 

Je sais pas à l'avance combien de tours il y aura. Donc, je pourrais finir avec

rounds: { 1: [..], 2: [..], 3: [..] } 

C'est ce que j'ai actuellement (ne fonctionne pas):

RoundsTable.propTypes = { 
    rounds: PropTypes.shape({ 
    PropTypes.arrayOf(PropTypes.shape({ 
     date: PropTypes.number.isRequired, 
     arena: PropTypes.string.isRequired, 
     scoreHome: PropTypes.number.isRequired, 
     scoreAway: PropTypes.number.isRequired, 
     teamHome: PropTypes.string.isRequired, 
     teamAway: PropTypes.string.isRequired, 
     spectators: PropTypes.number.isRequired 
    }).isRequired).isRequired 
    }).isRequired 
} 

Je ne sais pas comment spécifier le numéro qui contient le tableau d'objets. Est-ce un problème de conception de données de mon côté ou existe-t-il une solution simple pour spécifier ces types d'accessoires?

+0

Y a-t-il une raison pour laquelle vous utilisez un objet avec des clés numérotées plutôt qu'un tableau? –

Répondre

1

Ceci est un problème de conception de données. Vous utilisez un Object en tant que tableau. Par exemple, cela fonctionnerait si vous avez changé vos données en conséquence:

RoundsTable.propTypes = { 
    rounds: PropTypes.arrayOf(PropTypes.shape({ 
     date: PropTypes.number.isRequired, 
     arena: PropTypes.string.isRequired, 
     scoreHome: PropTypes.number.isRequired, 
     scoreAway: PropTypes.number.isRequired, 
     teamHome: PropTypes.string.isRequired, 
     teamAway: PropTypes.string.isRequired, 
     spectators: PropTypes.number.isRequired 
    }).isRequired).isRequired 
} 

Les données se présente comme suit:

rounds: [ 
     { 
     date: 1429354800000, 
     arena: 'Arena name', 
     scoreHome: 3, 
     scoreAway: 2, 
     teamHome: 'Home team name', 
     teamAway: 'Away team name', 
     spectators: 10 
     }, 
     {...} 
] 

Vous perdez les index, mais les tableaux ont déjà ceux-ci. Si vous voulez une fonctionnalité plus semblable à une carte, vous devez décider du type de carte à utiliser et baser vos PropTypes sur cela. Javascript n'a pas de cartes natives, bien que les gens utilisent très souvent Object dans le même but, qui a un certain nombre de limitations, comme celle que vous avez rencontrée.

+0

Cela a résolu mes problèmes. Toujours curieux de savoir s'il est possible de décrire ma structure initiale en utilisant PropTypes. Je vous remercie. – jollelj

+1

Le problème avec votre structure initiale est que vous n'utilisez pas '{}' correctement. C'est un objet littéral, pas une carte, et vous l'utilisez comme une carte. Le test que vous devriez faire dans votre tête est: Puis-je définir toutes les clés à l'avance? Si ce n'est pas le cas, vous voulez un tableau ou une carte (comme la classe ES6 'Map'). Dans votre cas, il n'y a pas de limite au nombre de tours, donc vous ne pouvez pas utiliser un littéral Object. La raison pour laquelle vous l'avez fait est probablement parce que vous avez parfois vu du code qui "abusait" des objets Javascript comme des goûts de carte, parce qu'ils sont si flexibles. Cela a-t-il du sens? – EugeneZ

+1

ce n'est pas une bonne réponse. tous les ints ne sont pas des index. J'ai le même problème où mes clés pourraient être: 126, 8654, 65683. ce n'est pas pour un tableau mais une clé de dictionnaire – DeGoltz