2017-02-17 13 views
7

Mam komponent <Button>.
Jeśli komponent nie ma this.props.children, chcę ustawić prop ariaLabel jako isRequired, w przeciwnym razie może być opcjonalne. Jak mogę to zrobić?React rekwizyty - zestaw isRequired na podpórce, jeśli inny podpór jest pusty/pusty

ariaLabel prop nie wymagane:

<Button>Add to bag</Button> 

ariaLabel prop musi być wymagane:

<Button ariaLabel="Add to bag" icon={ favorite } /> 

jeśli this.props.children i this.props.ariaLabel są puste, to zgłasza błąd mówiąc, że this.props.ariaLabel jest isRequired

<Button icon={ favorite } /> 

propTypes:

Button.propTypes = { 
    /** icon inside Button. */ 
    icon: React.PropTypes.object, 
    /** Content inside button */ 
    children: React.PropTypes.node, 
    /** Aria-label to screen readers */ 
    ariaLabel: React.PropTypes.string, /*isRequired if children is empty */ 
}; 

Dzięki

+1

Trzeba będzie coś podobnego https://github.com/evcohen/react-proptype-conditional-require to zrobić w propTypes sprzeciwu. – Joe

Odpowiedz

6

To może być dokładnie to, czego potrzebujesz: https://github.com/thejameskyle/react-required-if

W twoim przypadku, twoje propTypes byłoby:

import requiredIf from 'react-required-if'; 

Button.propTypes = { 
    /** icon inside Button. */ 
    icon: React.PropTypes.object, 
    /** Content inside button */ 
    children: React.PropTypes.node, 
    /** Aria-label to screen readers */ 
    ariaLabel: requiredIf(React.PropTypes.string, props => !props.children), /*isRequired if children is empty */ 
}; 
+0

yhp, zadziałało! thnsk –

+0

dlaczego używać strony trzeciej tutaj! – jalal246

21

Nie trzeba inną bibliotekę, „prop-typy” zapewnia to po wyjęciu z pudełka. Zobacz https://facebook.github.io/react/docs/typechecking-with-proptypes.html

Przykład:

import PropTypes from 'prop-types'; 

//.......  

ExampleComponent.propTypes = { 
    showDelete: PropTypes.bool, 
    handleDelete: function(props, propName, componentName) { 
     if ((props['showDelete'] == true && (props[propName] == undefined || typeof(props[propName]) != 'function'))) { 
      return new Error(
       'Please provide a handleDelete function!'; 
      ); 
     } 
    }, 

} 
+3

Tego właśnie szukałem. Nie chcę innej zależności. – grammar

+1

Biorąc pod uwagę, że 'prop-types' może to zrobić po wyjęciu z pudełka, jest to zdecydowanie najlepsza odpowiedź. – kylebebak

+0

Czy istnieje dobry sposób korzystania z formularzy propTypes wewnątrz tego? Myślę o takich rzeczach jak 'node' lub' shapeOf (...) ', gdzie test jest umiarkowanie skomplikowany do napisania. –

Powiązane problemy