Comment puis-je éventuellement inclure un élément dans JSX? Voici un exemple utilisant une bannière qui devrait être dans le composant si elle a été transmise. Ce que je veux éviter, c'est d'avoir à dupliquer des balises HTML dans l'instruction if.
render: function () {
var banner;
if (this.state.banner) {
banner = <div id="banner">{this.state.banner}</div>;
} else {
banner = ?????
}
return (
<div id="page">
{banner}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
javascript
reactjs
react-jsx
Jack Allan
la source
la source
else
succursale, ça marche? Je ne connais pas jsx ...Réponses:
Laissez simplement la bannière non définie et elle ne sera pas incluse.
la source
null
-il aussi bien queundefined
? Est-ce aussi une partie de la spécification selon laquelle cela fonctionne de cette façon et n'est donc pas susceptible de casser à l'avenir?Et ça. Définissons un
If
composant d' aide simple .Et utilisez-le de cette façon:
MISE À JOUR: Comme ma réponse devient populaire, je me sens obligé de vous avertir du plus grand danger lié à cette solution. Comme indiqué dans une autre réponse, le code à l'intérieur du
<If />
composant est toujours exécuté, que la condition soit vraie ou fausse. Par conséquent, l' exemple suivant échouera dans le cas oùbanner
estnull
(notez l'accès à la propriété sur la deuxième ligne):Vous devez être prudent lorsque vous l'utilisez. Je suggère de lire d'autres réponses pour des approches alternatives (plus sûres).
MISE À JOUR 2: Avec le recul, cette approche est non seulement dangereuse mais aussi désespérément lourde. C'est un exemple typique d'un développeur (moi) qui essaie de transférer des modèles et des approches qu'il connaît d'un domaine à un autre, mais cela ne fonctionne pas vraiment (dans ce cas, d'autres langages de modèles).
Si vous avez besoin d'un élément conditionnel, faites-le comme ceci:
Si vous avez également besoin de la branche else, utilisez simplement un opérateur ternaire:
C'est beaucoup plus court, plus élégant et sûr. Je l'utilise tout le temps. Le seul inconvénient est que vous ne pouvez pas effectuer de
else if
branchement aussi facilement, mais ce n'est généralement pas si courant.Quoi qu'il en soit, cela est possible grâce au fonctionnement des opérateurs logiques en JavaScript. Les opérateurs logiques permettent même de petites astuces comme celle-ci:
la source
ReactElement
<span>
ou<div>
.Personnellement, je pense vraiment que les expressions ternaires présentées dans ( JSX In Depth ) sont la manière la plus naturelle qui soit conforme aux normes ReactJs.
Voir l'exemple suivant. C'est un peu désordonné à première vue mais ça marche plutôt bien.
la source
Vous pouvez aussi l'écrire comme
Si votre
state.banner
estnull
ouundefined
, le côté droit de la condition est ignoré.la source
Le
If
composant de style est dangereux car le bloc de code est toujours exécuté quelle que soit la condition. Par exemple, cela provoquerait une exception nulle sibanner
estnull
:Une autre option consiste à utiliser une fonction en ligne (particulièrement utile avec les instructions else):
Une autre option parmi les problèmes de réaction :
la source
&& + style de code + petits composants
Cette syntaxe de test simple + convention de style de code + petits composants ciblés est pour moi l'option la plus lisible. Vous avez juste besoin de faire particulièrement attention aux valeurs de falsification comme
false
,0
ou""
.faire de la notation
La syntaxe de notation ES7 stage-0 do est également très agréable et je l'utiliserai définitivement lorsque mon IDE la prendra en charge correctement:
Plus de détails ici: ReactJs - Créer un composant "If" ... une bonne idée?
la source
short-circuit syntax
Simple, créez une fonction.
C'est un schéma que je suis personnellement tout le temps. Rend le code vraiment propre et facile à comprendre. De plus, il vous permet de refactoriser
Banner
son propre composant s'il devient trop volumineux (ou réutilisé dans d'autres endroits).la source
La
do
syntaxe expérimentale ES7 rend cela facile. Si vous utilisez Babel, activez laes7.doExpressions
fonction puis:Voir http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions
la source
Comme déjà mentionné dans les réponses, JSX vous présente deux options
Opérateur ternaire
{ this.state.price ? <div>{this.state.price}</div> : null }
Conjonction logique
{ this.state.price && <div>{this.state.price}</div> }
Cependant, ceux-ci ne fonctionnent pas
price == 0
.JSX rendra la fausse branche dans le premier cas et en cas de conjonction logique, rien ne sera rendu. Si la propriété peut être 0, utilisez simplement les instructions if en dehors de votre JSX.
la source
typeof(this.state.price) === "number"
comme condition (dans l'une ou l'autre variante).Ce composant fonctionne lorsque vous avez plusieurs éléments dans la branche "if":
Usage:
Ps quelqu'un pense que ces composants ne sont pas bons pour la lecture de code. Mais dans mon esprit, le HTML avec javascript est pire
la source
La plupart des exemples sont avec une ligne de "html" qui est rendue conditionnellement. Cela me semble lisible lorsque j'ai plusieurs lignes qui doivent être rendues conditionnellement.
Le premier exemple est bon car au lieu de
null
nous pouvons conditionnellement rendre un autre contenu comme{this.props.showContent ? content : otherContent}
Mais si vous avez juste besoin d'afficher / masquer le contenu, c'est encore mieux car les booléens, Null et Undefined sont ignorés
la source
Il existe une autre solution, si composant pour React :
la source
J'utilise un raccourci plus explicite: Une expression de fonction immédiatement invoquée (IIFE):
la source
J'ai fait https://www.npmjs.com/package/jsx-control-statements pour le rendre un peu plus facile, au fond , il vous permet de définir
<If>
conditionals sous forme de balises et les compile ensuite dans ifs ternaires afin que le code à l' intérieur du<If>
seul obtient exécuté si la condition est vraie.la source
Il existe également une version en ligne très propre ... {this.props.product.title || "Pas de titre" }
C'est à dire:
la source
J'ai récemment créé https://github.com/ajwhite/render-if pour rendre les éléments en toute sécurité uniquement si le prédicat passe .
ou
la source
Vous pouvez conditionnellement inclure des éléments à l'aide de l'opérateur ternaire comme ceci:
la source
Vous pouvez utiliser une fonction et renvoyer le composant et réduire la fonction de rendu
la source
Voici mon approche en utilisant ES6.
Démo: http://jsfiddle.net/kb3gN/16688/
J'utilise du code comme:
Cela ne sera rendu
SomeElement
que siopened
c'est vrai. Cela fonctionne en raison de la façon dont JavaScript résout les conditions logiques:Comme
React
je l'ignoreraifalse
, je trouve que c'est un très bon moyen de rendre conditionnellement certains éléments.la source
Peut-être que cela aide quelqu'un qui tombe sur la question: tous les rendus conditionnels dans React C'est un article sur toutes les différentes options de rendu conditionnel dans React.
Points clés à retenir pour savoir quel rendu conditionnel:
** sinon
** opérateur ternaire
** opérateur && logique
** boîtier de commutateur
** énumérations
** rendus conditionnels à plusieurs niveaux / imbriqués
** HOC
** composants de modèles externes
la source
Avec ES6, vous pouvez le faire avec une simple doublure
"show" est un booléen et vous utilisez cette classe par
la source
Je ne pense pas que cela ait été mentionné. C'est comme votre propre réponse, mais je pense que c'est encore plus simple. Vous pouvez toujours renvoyer des chaînes à partir des expressions et vous pouvez imbriquer jsx à l'intérieur des expressions, ce qui permet une expression en ligne facile à lire.
la source
Je aime l'explicitation des expressions de fonction Immédiatement-(OPPOSABLES AU
IIFE
) etif-else
plusrender callbacks
etternary operators
.Vous avez juste besoin de vous familiariser avec la
IIFE
syntaxe,{expression}
c'est la syntaxe React habituelle, à l'intérieur il suffit de considérer que vous écrivez une fonction qui s'appelle elle-même.qui doivent être enveloppés dans des parens
la source
Il existe également une technique utilisant des accessoires de rendu pour effectuer un rendu conditionnel d'un composant. Son avantage est que le rendu n'est pas évalué tant que la condition n'est pas remplie, ce qui n'entraîne aucun souci pour les valeurs nulles et non définies .
la source
Lorsque vous ne devez rendre quelque chose que si la condition passée est remplie, vous pouvez utiliser la syntaxe:
Le code de cette manière ressemblerait à ceci:
Il y a, bien sûr, d'autres façons valables de le faire, tout dépend des préférences et de l'occasion. Vous pouvez en savoir plus sur la façon de faire un rendu conditionnel dans React dans cet article si vous êtes intéressé!
la source
Juste pour ajouter une autre option - si vous aimez / tolérez coffee-script, vous pouvez utiliser coffee-react pour écrire votre JSX, auquel cas si les instructions / else sont utilisables car ce sont des expressions dans coffee-script et non des instructions:
la source
Juste pour étendre la réponse de @Jack Allan avec des références aux documents.
La documentation de base de React (Démarrage rapide) suggère
null
dans ce cas. Cependant, les booléens, Null et non définis sont également ignorés , mentionnés dans le guide avancé.la source