¿Hay alguna manera de agregar solo atributos a un componente Reaccionar si se cumple una determinada condición?
Se supone que debo agregar los atributos obligatorios y readOnly para formar elementos basados en una llamada Ajax después del renderizado, pero no puedo ver cómo resolver esto ya que readOnly = "false" no es lo mismo que omitir el atributo por completo.
El siguiente ejemplo debería explicar lo que quiero, pero no funcionará (Error de análisis: identificador inesperado).
var React = require('React');
var MyOwnInput = React.createClass({
render: function () {
return (
<div>
<input type="text" onChange={this.changeValue} value={this.getValue()} name={this.props.name}/>
</div>
);
}
});
module.exports = React.createClass({
getInitialState: function () {
return {
isRequired: false
}
},
componentDidMount: function () {
this.setState({
isRequired: true
});
},
render: function () {
var isRequired = this.state.isRequired;
return (
<MyOwnInput name="test" {isRequired ? "required" : ""} />
);
}
});
javascript
reactjs
Remi Sture
fuente
fuente
aria-modal=true
, empuja los cambios (a falso) al almacén de atributos aria / datos , pero no se cambia nada más (como el contenido del componente o la clase o las variables allí) como resultado, ReactJs no actualizará aria / atributos de datos en esos componentes. He estado jugando todo el día para darme cuenta de eso.Respuestas:
Aparentemente, para ciertos atributos, React es lo suficientemente inteligente como para omitir el atributo si el valor que le pasas no es verdadero. Por ejemplo:
resultará en:
Actualización: si alguien tiene curiosidad sobre cómo / por qué sucede esto, puede encontrar detalles en el código fuente de ReactDOM, específicamente en las líneas 30 y 167 del archivo DOMProperty.js .
fuente
null
significa "actuar como si no lo hubiera especificado en absoluto". Para los atributos dom booleanos verdadero / falso es preferible a repetir el nombre del atributo / falso, por ejemplo,<input disabled>
compila aReact.createElement('input', {disabled: true})
="required"
parte. Chrome en realidad renderizó solo el atributo sin el valor.readonly
nunca se agrega porque React está esperando el atributoreadOnly
(con una O mayúscula).alt={props.alt || null}
.false
, pero solo menull
aseguré de que el atributo se haya eliminado realmente.La respuesta de juandemarco suele ser correcta, pero aquí hay otra opción.
Construye un objeto como quieras:
Render con extensión, opcionalmente pasando otros accesorios también.
fuente
_extends
se le ha agregado una función , que (en circunstancias normales) tomará elprops
construido de los "atributos normales" y se aplicanObject.assign(props, inputProps)
.Aquí es un ejemplo del uso Bootstrap 's
Button
a través de Reaccionar-Bootstrap (versión 0.32.4):Dependiendo de la condición,
{bsStyle: 'success'}
o{}
será devuelto. El operador de propagación distribuirá las propiedades del objeto devuelto alButton
componente. En el caso falso, dado que no existen propiedades en el objeto devuelto, no se pasará nada al componente.Una forma alternativa basada en el comentario de Andy Polhill :
La única pequeña diferencia es que en el segundo ejemplo que el componente interno
<Button/>
'sprops
objeto tendrá una clavebsStyle
con un valor deundefined
.fuente
{bsStyle: 'success'}
o lo que{}
resulta de ella), luego ese objeto se propaga.<Button bsStyle={ condition ? 'success': undefined } />
Creo que la sintaxis es un poco más fácil, pasarundefined
omitirá la propiedad.<Button/>
, elprops
objeto del componente interno tendrá una clavebsStyle
con valor deundefined
.Aquí hay una alternativa.
O su versión en línea
fuente
condition
es falso, esto intentará expandirse / iterar sobre falso, lo que no creo que sea correcto.false
no es uno. Solo verifique con Babel. Esto funciona cuando secondition
evalúa como falso ya que Babel implementa el operador. Aunque podría ser una solución trivial...( condition ? { disabled: true } : {} )
, entonces se vuelve un poco detallado. Gracias por esta buena entrada!data-*
oaria-*
atributos, ya que son un caso especial en JSX, pordata-my-conditional-attr={ false }
lo tanto, generará endata-my-conditional-attr="false"
lugar de omitir el atributo. facebook.github.io/react/docs/dom-elements.htmlAquí hay una forma en que lo hago.
Con un condicional :
Todavía prefiero usar la forma regular de pasar los accesorios, porque es más legible (en mi opinión) en el caso de que no tenga ningún tipo de condicionales.
Sin un condicional :
fuente
...(tooltip && { tooltip }),
? Funciona en el componente, pero cuando trato de usar algo como esto en el código recibo un error que significa que trato de difundir el valor no iterablefalseyValue && {}
devolverá falso, por lo que es probable que se esté extendiendo en falso, por ejemplo...(false)
. mucho mejor usar la expresión completa para que la propagación continúe comportándose...(condition ? {foo: 'bar'} : {})
Puede usar el mismo acceso directo, que se usa para agregar / eliminar (partes de) componentes (
{isVisible && <SomeComponent />}
).fuente
someCondition
es verdadero perosomeValue
es falso (por ejemplofalse
, sí mismo0
, etc.), ¿el atributo todavía se incluye? Esto es importante si es necesario incluir explícitamente un valor falso, por ejemplo, a0
para un atributo de coordenadas, etc.data-*
yaria-*
, vea mi comentario más arriba. Si cita el valor o losomeAttr={ `${falsyValue}` }
convierte en una Cadena, el atributo mostrará: por ejemplo, podría renderizarsomeAttr="false"
Digamos que queremos agregar una propiedad personalizada (usando aria- * o data- *) si una condición es verdadera:
Digamos que queremos agregar una propiedad de estilo si una condición es verdadera:
fuente
Si usa ECMAScript 6, simplemente puede escribir así.
fuente
Esto debería funcionar, ya que su estado cambiará después de la llamada Ajax, y el componente padre se volverá a procesar.
fuente
En React puede renderizar condicionalmente Componentes, pero también sus atributos, como accesorios, className, id y más.
En React es una muy buena práctica usar el operador ternario que puede ayudarlo a procesar componentes condicionalmente.
Un ejemplo también muestra cómo renderizar condicionalmente Component y su atributo de estilo.
Aquí hay un ejemplo simple:
fuente
Teniendo en cuenta la publicación JSX In Depth , puede resolver su problema de esta manera:
fuente