Existe-t-il un moyen d'ajouter des attributs à un composant React uniquement si une certaine condition est remplie?
Je suis censé ajouter des attributs requis et readOnly pour former des éléments basés sur un appel Ajax après le rendu, mais je ne vois pas comment résoudre ce problème car readOnly = "false" n'est pas la même chose que d'omettre complètement l'attribut.
L'exemple ci-dessous devrait expliquer ce que je veux, mais cela ne fonctionnera pas (erreur d'analyse: identifiant inattendu).
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
la source
la source
aria-modal=true
, vous poussez les modifications (sur false) dans le magasin d' attributs aria / data , mais rien d'autre n'est modifié (comme le contenu ou la classe du composant ou les variables dedans) car le résultat ReactJs ne mettra pas à jour aria / attrs de données dans ces composants. J'ai déconné toute la journée pour le réaliser.Réponses:
Apparemment, pour certains attributs, React est suffisamment intelligent pour omettre l'attribut si la valeur que vous lui passez n'est pas véridique. Par exemple:
aura pour résultat:
Mise à jour: si quelqu'un est curieux de savoir comment / pourquoi cela se produit, vous pouvez trouver des détails dans le code source de ReactDOM, en particulier aux lignes 30 et 167 du fichier DOMProperty.js .
la source
null
"agir comme si je ne l'avais pas spécifié du tout". Pour les attributs booléens dom, true / false est préférable à la répétition du nom d'attribut / false, par exemple,<input disabled>
compile àReact.createElement('input', {disabled: true})
="required"
pièce. Chrome n'a rendu que l'attribut sans la valeur.readonly
n'est jamais ajouté car React attend l'attributreadOnly
(avec un O majuscule).alt={props.alt || null}
.false
, mais je m'étais seulementnull
assuré que l'attribut était réellement supprimé.réponse de juandemarco est généralement correcte, mais voici une autre option.
Construisez un objet comme vous le souhaitez:
Rendu avec propagation, en passant éventuellement d'autres accessoires également.
la source
_extends
a été ajoutée, qui (dans des circonstances normales) prendra laprops
construction de les "attributs normaux" et appliquerObject.assign(props, inputProps)
.Voici un exemple d'utilisation Bootstrap « s
Button
via React-Bootstrap (version 0.32.4):Selon l'état, soit
{bsStyle: 'success'}
ou{}
sera retourné. L'opérateur d'étalement répartit ensuite les propriétés de l'objet renvoyé vers leButton
composant. Dans le cas falsifié, car aucune propriété n'existe sur l'objet retourné, rien ne sera transmis au composant.Une manière alternative basée sur le commentaire d'Andy Polhill :
La seule petite différence est que , dans le deuxième exemple , le composant intérieur
<Button/>
de »props
l'objet aura une clébsStyle
avec une valeur deundefined
.la source
{bsStyle: 'success'}
ou en{}
résulte), puis cet objet est étalé.<Button bsStyle={ condition ? 'success': undefined } />
je trouve la syntaxe un peu plus facile, le passageundefined
omettra la propriété.<Button/>
l'props
objet du composant interne aura une clébsStyle
avec une valeur deundefined
.Voici une alternative.
Ou sa version en ligne
la source
condition
est faux, cela tentera de développer / itérer sur faux, ce qui ne me semble pas correct.false
n'en est pas un. Vérifiez auprès de Babel. Cela fonctionne avec lorsqu'il estcondition
évalué comme faux depuis la façon dont Babel implémente l'opérateur. Bien qu'une solution de contournement triviale puisse être...( condition ? { disabled: true } : {} )
, elle devient alors un peu verbeuse. Merci pour cette belle entrée!data-*
ouaria-*
attribuer des attributs de manière conditionnelle , car ils sont un cas spécial dans JSX, de sortedata-my-conditional-attr={ false }
que la sortie seradata-my-conditional-attr="false"
plutôt que d'omettre l'attribut. facebook.github.io/react/docs/dom-elements.htmlVoici une façon de procéder.
Avec un conditionnel :
Je préfère toujours utiliser la méthode habituelle de transmission des accessoires, car elle est plus lisible (à mon avis) dans le cas où il n'y a pas de conditionnel.
Sans conditionnel :
la source
...(tooltip && { tooltip }),
? Cela fonctionne sur le composant, mais lorsque j'essaie d'utiliser quelque chose comme ça dans le code, j'obtiens une erreur signifiant que j'essaie de diffuser une valeur non itérablefalseyValue && {}
que retournera faux, donc il est probable que vous étaliez sur faux, par exemple...(false)
. il vaut mieux utiliser la pleine expression pour que la propagation continue de se comporter...(condition ? {foo: 'bar'} : {})
Vous pouvez utiliser le même raccourci, qui est utilisé pour ajouter / supprimer (des parties de) composants (
{isVisible && <SomeComponent />}
).la source
someCondition
est vrai maissomeValue
est faux (par exemplefalse
lui-même, ou0
, etc.), l'attribut est-il toujours inclus? Ceci est important s'il est nécessaire d'inclure explicitement une valeur falsifiée, par exemple un0
pour un attribut de coordonnées, etc.data-*
etaria-*
, voir mon commentaire ci-dessus. Si vous citez la valeur ou lasomeAttr={ `${falsyValue}` }
someAttr="false"
Disons que nous voulons ajouter une propriété personnalisée (en utilisant aria- * ou data- *) si une condition est vraie:
Disons que nous voulons ajouter une propriété de style si une condition est vraie:
la source
Si vous utilisez ECMAScript 6, vous pouvez simplement écrire comme ceci.
la source
Cela devrait fonctionner, car votre état changera après l'appel Ajax et le composant parent sera rendu de nouveau.
la source
Dans React, vous pouvez effectuer un rendu conditionnel des composants, mais également de leurs attributs, tels que les accessoires, className, id, etc.
Dans React, il est très recommandé d'utiliser l' opérateur ternaire qui peut vous aider à effectuer le rendu conditionnel des composants.
Un exemple montre également comment restituer conditionnellement Component et son attribut de style.
Voici un exemple simple:
la source
En considérant le post JSX In Depth , vous pouvez résoudre votre problème de cette façon:
la source