react example create array javascript reactjs wai-aria

javascript - example - Reaccionar props-establecer isRequired en un prop si otro prop es nulo/vacío



react map object (3)

Tengo un componente <Button> .
Si el componente no tiene this.props.children , quiero configurar el prop ariaLabel como isRequired , de lo contrario, puede ser opcional. ¿Cómo puedo hacer eso?

ariaLabel prop no requiere:

<Button>Add to bag</Button>

ariaLabel prop tiene que ser requerido:

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

si this.props.children y this.props.ariaLabel están vacíos, arroja un error que this.props.ariaLabel que this.props.ariaLabel is 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 */ };

Gracias


Esto puede ser exactamente lo que necesita: https://github.com/thejameskyle/react-required-if

En su caso, sus tipos de propiedad serían:

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 */ };


No necesita otra biblioteca, los ''tipos de prop'' proporcionan esto fuera de la caja. Ver https://facebook.github.io/react/docs/typechecking-with-proptypes.html

Ejemplo:

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!''; ); } }, }


Para agregar a la respuesta de @ chickenchilli anterior, puedes abstraer esto en una función de ayuda más práctica como esta:

conditionalPropType.js

export default function conditionalPropType(condition, message) { if(typeof condition !== ''function'') throw "Wrong argument type ''condition'' supplied to ''conditionalPropType''"; return function(props, propName, componentName) { if (condition(props, propName, componentName)) { return new Error(`Invalid prop ''${propName}'' ''${props[propName]}'' supplied to ''${componentName}''. ${message}`); } } }

MyComponent.js

import PropTypes from ''prop-types''; import conditionalPropType from ''./conditionalPropType''; [...] MyComponent.propTypes = { conditionProp: PropTypes.bool, dependentProp: conditionalPropType(props => (props.condition && typeof(props.someProp) !== ''boolean''), "''dependentProp'' must be boolean if ''conditionProp'' is true"), };