Me gustaría saber si hay una mejor manera de pasar un accesorio condicionalmente que usar una declaración if.
Por ejemplo, ahora mismo tengo:
var parent = React.createClass({
propTypes: {
editable: React.PropTypes.bool.isRequired,
editableOpts: React.PropTypes.shape({...})
},
render: function() {
if(this.props.editable) {
return (
<Child editable={this.props.editableOpts} />
);
} else {
// In this case, Child will use the editableOpts from its own getDefaultProps()
return (
<Child />
);
}
}
});
¿Hay alguna forma de escribir esto sin la declaración if? Estaba pensando en algo parecido a un tipo de declaración en línea en el JSX:
var parent = React.createClass({
propTypes: {
editable: React.PropTypes.bool.isRequired,
editableOpts: React.PropTypes.shape({...})
},
render: function() {
return (
<Child
{this.props.editable ? editable={this.props.editableOpts} : null}
/>
);
}
});
Para concluir : estoy tratando de encontrar una manera de definir un prop para Child, pero pasar un valor (o hacer algo más) de modo que Childaún extraiga el valor de ese prop del Childpropio getDefaultProps().
javascript
reactjs
inline
Matthew Herbst
fuente
fuente

Childtambién? Además, ¿quiso decir en<Child editableOpts={this.props.editableOpts} />lugar de<Child editable={this.props.editableOpts} />?react-bootstrap-tabley ese es el formato que usan. No estoy seguro de que elChildcódigo realmente importe para lo que estoy preguntando, por eso no lo incluí. Realmente solo estoy buscando una forma de pasar o no pasar opcionalmente un accesorioChildque no requiera tener una cantidad masiva de código similar en declaraciones if enParent.Respuestas:
Estuviste cerca de tu idea. Resulta que pasar
undefinedpor un accesorio es lo mismo que no incluirlo en absoluto, lo que aún activará el valor de accesorio predeterminado. Entonces podrías hacer algo como esto:var parent = React.createClass({ propTypes: { editable: React.PropTypes.bool.isRequired, editableOpts: React.PropTypes.shape({...}) }, render: function() { return <Child editable={this.props.editable ? this.props.editableOpts : undefined} />; } });fuente
nullno está armado con un poder comoundefined, por cierto.falsecaso de que no me funcione como quería, todavía obtengo un par clave-valorproperty::null. ¿Todavía es posible hacerlo de alguna manera con un solo elemento JSX?Agregue un operador de propagación a
this.props.editable:<Child {...(this.props.editable ? {editable: {this.props.editableOpts}} : {})} >Deberia trabajar.
fuente
undefinedcomo una anulación (comonull, que siempre es una anulación), por lo que la única forma de mantener el valor predeterminado en lugar de establecerlo en un valor falso es explícitamente no pasarlo, no pasarundefined.{}al final.Definir
propsvariable:let props = {}; if (this.props.editable){ props.editable = this.props.editable; }Y luego úselo en JSX:
Aquí hay una solución en su código:
var parent = React.createClass({ propTypes: { editable: React.PropTypes.bool.isRequired, editableOpts: React.PropTypes.shape({...}) }, render: function() { let props = {}; if (this.props.editable){ props.editable = this.props.editable; } return ( <Child {...props} /> ); } });Fuente, documentación de React: https://facebook.github.io/react/docs/jsx-in-depth.html#spread-attributes
fuente
childPropsembargoEn realidad, si su prop es booleano, no es necesario implementar la condición, pero si desea agregar prop por condición en línea, debe escribir como se muestra a continuación:
const { editable, editableOpts } = this.props; return ( <Child {...(editable && { editable: editableOpts } )} /> );Espero que no te confunda. el
{...medio es operador extendido como pasar apoyos existentes:{...props}y eleditable &&medio sieditableestrueel{ editable: editableOpts }objeto hará y con{...crearemos un nuevo objeto como este:{...{ editable: editableOpts }}eso significaeditable={editableOpts}pero sithis.porps.editablees verdadero.fuente
var parent = React.createClass({ propTypes: { editable: React.PropTypes.bool.isRequired, editableOpts: React.PropTypes.shape({...}) }, render: function() { return ( <Child {...(this.props.editable && {editable=this.props.editableOpts})} /> ); } });Esto pasa los apoyos si están definidos. De lo contrario, los accesorios no se pasan. En las otras respuestas, los accesorios todavía se pasan, pero el valor es
undefinedque aún significa que se están pasando los accesorios.fuente
undefineda un accesorio es equivalente a no pasarlo en absoluto.también puedes probar esta forma corta
<Child {...(this.props.editable && { editable: this.props.editableOpts })} />fuente