J'ai la déclaration de court-circuit simple suivante qui devrait montrer un composant ou rien:
{profileTypesLoading && <GeneralLoader />}
Si l'instruction est fausse, elle rend un 0
Au lieu de rien.
J'ai fait une console.log(profileTypesLoading)
juste pour voir rapidement quel est le statut de la propriété profileTypesLoading
et c'est soit 1 soit 0 comme prévu. 0 devrait être faux ... ne provoquant aucun rendu. Droite?
Une idée de comment cela a-t-il pu arriver?
Puisque votre condition est fausse et ne renvoie donc pas le deuxième argument (<GeneralLoader />
), il renverra profileTypesLoading
, qui est un nombre, donc react le rendra car React saute le rendu pour tout ce qui est typeof
boolean
ou undefined
et rendra tout ce qui est typeof
string
ou number
:
Pour le sécuriser, vous pouvez soit utiliser une expression ternaire {condition ? <Component /> : null}
ou booléen exprimez votre condition comme {!!condition && <Component />}
0 est une valeur fausse, donc lorsqu'elle est évaluée par &&, elle renvoie 0. Cependant, 0 est renduable par React car c'est un nombre:
// Renderable values
1 && <GeneralLoader /> // => Renders <GeneralLoader />
"a string" && <GeneralLoader /> // => Renders <GeneralLoader />
0 && <GeneralLoader /> // => Renders '0'
// Non-renderable values
false && <GeneralLoader /> // => Renders nothing
null && <GeneralLoader /> // => Renders nothing
undefined && <GeneralLoader /> // => Renders nothing
[~ # ~] tldr [~ # ~]
C'est à cause de la façon dont javascript lui-même traite vérité et fausse valeurs :
En JavaScript, une valeur véridique est une valeur considérée comme vraie lorsqu'elle est rencontrée dans un contexte booléen. Toutes les valeurs sont véridiques, sauf si elles sont définies comme fausses (c'est-à-dire, à l'exception de false, 0, "", null, indéfini et NaN).
Lorsqu'elle est utilisée avec l'opérateur &&, la valeur renvoyée dépend de la valeur de gauche:
Exemples:
// Truthy values
1 && "hello" // => "hello"
"a string" && "hello" // => "hello"
// Falsy values
0 && "hello" // => 0
false && "hello" // => false
null && "hello" // => null
undefined && "hello" // => undefined
Les mêmes règles s'appliquent à JSX car c'est ne extension de syntaxe pour JavaScript . Cependant, le problème est que **
Le problème est que 0 est une valeur fausse, donc lorsqu'elle est évaluée par &&, elle renvoie 0. Cependant, 0 est rendu par React car c'est un nombre
// Renderable values
1 && <GeneralLoader /> // => Renders <GeneralLoader />
"a string" && <GeneralLoader /> // => Renders <GeneralLoader />
0 && <GeneralLoader /> // => Renders '0'
// Non-renderable values
false && <GeneralLoader /> // => Renders nothing
null && <GeneralLoader /> // => Renders nothing
undefined && <GeneralLoader /> // => Renders nothing
Cela résoudrait le problème:
{!!profileTypesLoading && <GeneralLoader />}
Comme il convertira 0 en faux. La raison est quand c'est 0
la condition suivante n'est pas exécutée et elle se comporte comme un nombre en JavaScript, donc la double négation aide ici.