2015-09-01 11 views
122

Esiste un modo incorporato per utilizzare proptype per garantire che una matrice di oggetti passati a un componente sia in realtà una matrice di oggetti di una forma specifica?Reatt array di proptype con forma

Forse qualcosa del genere?

annotationRanges: PropTypes.array(PropTypes.shape({ 
    start: PropTypes.number.isRequired, 
    end: PropTypes.number.isRequired, 
})), 

Mi manca qualcosa di super ovvio qui? Sembra che questo sarebbe molto ricercato.

risposta

187

È possibile utilizzare React.PropTypes.shape() come argomento per React.PropTypes.arrayOf():

// an array of a particular shape. 
ReactComponent.propTypes = { 
    arrayWithShape: React.PropTypes.arrayOf(React.PropTypes.shape({ 
    color: React.PropTypes.string.isRequired, 
    fontSize: React.PropTypes.number.isRequired, 
    })).isRequired, 
} 

Vedere la sezione Prop Validation della documentazione.

UPDATE

A partire dal react v15.5, utilizzando React.PropTypes è deprecato e il pacchetto autonomo prop-types dovrebbe essere utilizzato al posto:

// an array of a particular shape. 
import PropTypes from 'prop-types'; // ES6 
var PropTypes = require('prop-types'); // ES5 with npm 
ReactComponent.propTypes = { 
    arrayWithShape: PropTypes.arrayOf(PropTypes.shape({ 
    color: PropTypes.string.isRequired, 
    fontSize: PropTypes.number.isRequired, 
    })).isRequired, 
} 
+11

Vale la pena di sottolineare l'uso di '.isRequired' su ogni proprietà di' React.PropTypes.shape'. Sono arrivato qui perché ho assunto erroneamente che usando '.isRequired' su' React.PropTypes.arrayOf', non ne avevo bisogno all'interno. Per ottenere la convalida completa della copertura, in realtà ho finito per applicarlo direttamente a 'React.PropTypes.shape'. – gfullam

+1

Sì, stavo facendo esattamente la stessa cosa di te, ma è molto più potente avere la possibilità di contrassegnare solo le chiavi che vuoi. A proposito, l'esplicito è sempre meglio che implicito per me. – Pcriulan

1

C'è una scorciatoia importazione ES6, è possibile fare riferimento. Più leggibile e facile da digitare.

import React, { Component } from 'react'; 
import { arrayOf, shape, number } from 'prop-types'; 

class ExampleComponent extends Component { 
    static propTypes = { 
    annotationRanges: arrayOf(shape({ 
     start: number, 
     end: number, 
    })).isRequired, 
    } 

    static defaultProps = { 
    annotationRanges: [], 
    } 
} 
+1

Rivedi [Come scrivere una buona risposta] (https://stackoverflow.com/help/how-to-answer). Le risposte al solo codice sono scoraggiate perché non spiegano come risolvono il problema nella domanda. Dovresti aggiornare la tua risposta per spiegare cosa fa e come migliora le risposte in aumento di cui questa domanda ha già fatto. – FluffyKitten

5

Sì, è necessario utilizzare PropTypes.arrayOf invece di PropTypes.array nel codice, si può fare qualcosa di simile:

import PropTypes from 'prop-types'; 

MyComponent.propTypes = { 
    annotationRanges: PropTypes.arrayOf(
    PropTypes.shape({ 
     start: PropTypes.string.isRequired, 
     end: PropTypes.number.isRequired 
    }).isRequired 
).isRequired 
} 

Anche per maggiori dettagli su proptypes, visitare Typechecking Con PropTypeshere

1

Se devo definire più volte gli stessi proptypes per una particolare forma, mi piace estenderlo a un file proptypes in modo che se la forma dell'oggetto cambia , Devo solo cambiare il codice in un posto. Aiuta a seccare un po 'il codice base.

Esempio:

// Inside my proptypes.js file 
import PT from 'prop-types'; 

export const product = { 
    id: PT.number.isRequired, 
    title: PT.string.isRequired, 
    sku: PT.string.isRequired, 
    description: PT.string.isRequired, 
}; 


// Inside my component file 
import PT from 'prop-types'; 
import { product } from './proptypes; 


List.propTypes = { 
    productList: PT.arrayOf(product) 
} 
Problemi correlati