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 Child
aún extraiga el valor de ese prop del Child
propio getDefaultProps()
.
javascript
reactjs
inline
Matthew Herbst
fuente
fuente
Child
también? Además, ¿quiso decir en<Child editableOpts={this.props.editableOpts} />
lugar de<Child editable={this.props.editableOpts} />
?react-bootstrap-table
y ese es el formato que usan. No estoy seguro de que elChild
có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 accesorioChild
que no requiera tener una cantidad masiva de código similar en declaraciones if enParent
.Respuestas:
Estuviste cerca de tu idea. Resulta que pasar
undefined
por 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
null
no está armado con un poder comoundefined
, por cierto.false
caso 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
undefined
como 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
props
variable: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
childProps
embargoEn 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 sieditable
estrue
el{ editable: editableOpts }
objeto hará y con{...
crearemos un nuevo objeto como este:{...{ editable: editableOpts }}
eso significaeditable={editableOpts}
pero sithis.porps.editable
es 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
undefined
que aún significa que se están pasando los accesorios.fuente
undefined
a 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