Je joue avec React.js pour la première fois et je ne trouve pas de moyen d'afficher ou de masquer quelque chose sur une page via un événement de clic. Je ne charge aucune autre bibliothèque sur la page, je cherche donc une manière native d'utiliser la bibliothèque React. C'est ce que j'ai jusqu'à présent. Je voudrais afficher les résultats div lorsque l'événement click se déclenche.
var Search= React.createClass({
handleClick: function (event) {
console.log(this.prop);
},
render: function () {
return (
<div className="date-range">
<input type="submit" value="Search" onClick={this.handleClick} />
</div>
);
}
});
var Results = React.createClass({
render: function () {
return (
<div id="results" className="search-results">
Some Results
</div>
);
}
});
React.renderComponent(<Search /> , document.body);
javascript
reactjs
user1725382
la source
la source
Réponses:
Réagissez vers 2020
Dans le
onClick
rappel, appelez la fonction setter du hook d'état pour mettre à jour l'état et restituer:JSFiddle
React vers 2014
La clé consiste à mettre à jour l'état du composant dans le gestionnaire de clics à l'aide de
setState
. Lorsque les changements d'état sont appliqués, larender
méthode est appelée à nouveau avec le nouvel état:JSFiddle
la source
la source
Voici une syntaxe alternative pour l'opérateur ternaire:
est équivalent à:
Lean pourquoi
Également une syntaxe alternative avec
display: 'none';
Cependant, si vous en abusez
display: 'none'
, cela conduit à une pollution DOM et ralentit finalement votre application.la source
Voici mon approche.
Dans le code ci-dessus, pour y parvenir, 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:Raisons d'utiliser cette approche au lieu de CSS 'display: none';
<TabView>
) changeront - même si vous ne voyez qu'un seul onglet, les 5 onglets seront tous rendusdisplay: invisible ? 'block' : 'none'
ce qui pourrait casser la mise en pagesomeBoolean && <SomeNode />
est très simple à comprendre et à raisonner, surtout si votre logique liée à l'affichage de quelque chose ou non devient complexela source
this.setState({isOpened: !isOpened});
. Ne dépendez pas de l'état lui-même lorsque vous modifiez l'état. Voici un bon exemple: reactjs.org/docs/… Il devrait donc en être ainsithis.setState( s => ({isOpened: !s.isOpened}) )
. Notez la fonction de flèche dans setState.avec la dernière version react 0.11, vous pouvez également simplement retourner null pour ne pas avoir de contenu rendu.
Rendu à null
la source
J'ai créé un petit composant qui gère cela pour vous: react-toggle-display
Il définit l'attribut style sur la
display: none !important
base duhide
ou desshow
accessoires.Exemple d'utilisation:
la source
Il y a déjà plusieurs bonnes réponses, mais je ne pense pas qu'elles aient été très bien expliquées et plusieurs des méthodes données contiennent des pièges qui pourraient trébucher. Je vais donc passer en revue les trois principales méthodes (plus une option hors sujet) pour le faire et expliquer les avantages et les inconvénients. J'écris principalement cela parce que l'option 1 a été beaucoup recommandée et qu'il y a beaucoup de problèmes potentiels avec cette option si elle n'est pas utilisée correctement.
Option 1: rendu conditionnel dans le parent.
Je n'aime pas cette méthode, sauf si vous n'allez rendre le composant qu'une seule fois et le laisser là. Le problème est qu'il provoquera la réaction de créer le composant à partir de zéro à chaque fois que vous basculez la visibilité. Voici l'exemple. LogoutButton ou LoginButton sont rendus conditionnellement dans le LoginControl parent. Si vous exécutez cela, vous remarquerez que le constructeur est appelé à chaque clic sur le bouton. https://codepen.io/Kelnor/pen/LzPdpN?editors=1111
Maintenant, React est assez rapide pour créer des composants à partir de zéro. Cependant, il doit toujours appeler votre code lors de sa création. Donc, si votre code constructeur, componentDidMount, rendu, etc. est cher, cela ralentira considérablement l'affichage du composant. Cela signifie également que vous ne pouvez pas l'utiliser avec des composants avec état où vous souhaitez que l'état soit préservé lorsqu'il est masqué (et restauré lorsqu'il est affiché.) Le seul avantage est que le composant caché n'est pas créé du tout tant qu'il n'est pas sélectionné. Les composants cachés ne retarderont donc pas le chargement initial de votre page. Il peut également y avoir des cas où vous VOULEZ réinitialiser un composant avec état lorsqu'il est basculé. Dans ce cas, c'est votre meilleure option.
Option 2: Rendu conditionnel chez l'enfant
Cela crée les deux composants une fois. Puis court-circuite le reste du code de rendu si le composant est masqué. Vous pouvez également court-circuiter d'autres logiques dans d'autres méthodes à l'aide de l'hélice visible. Remarquez le fichier console.log dans la page codepen. https://codepen.io/Kelnor/pen/YrKaWZ?editors=0011
Maintenant, si la logique d'initialisation est rapide et que les enfants sont sans état, vous ne verrez aucune différence de performances ou de fonctionnalités. Cependant, pourquoi faire en sorte que React crée un tout nouveau composant chaque bascule de toute façon? Cependant, si l'initialisation est coûteuse, l'option 1 l'exécutera à chaque fois que vous basculerez sur un composant, ce qui ralentira la page lors du basculement. L'option 2 exécutera tous les inits du composant lors du chargement de la première page. Ralentir cette première charge. Faut noter à nouveau. Si vous ne montrez le composant qu'une seule fois en fonction d'une condition et ne le changez pas, ou si vous souhaitez qu'il se réinitialise lors du basculement, l'option 1 est correcte et probablement la meilleure option.
Si le chargement lent des pages pose problème, cela signifie que vous avez du code coûteux dans une méthode de cycle de vie et ce n'est généralement pas une bonne idée. Vous pouvez, et devriez probablement, résoudre le lent chargement des pages en retirant le code coûteux des méthodes de cycle de vie. Déplacez-le vers une fonction asynchrone lancée par ComponentDidMount et demandez au rappel de le placer dans une variable d'état avec setState (). Si la variable d'état est nulle et que le composant est visible, la fonction de rendu renvoie un espace réservé. Sinon, restituez les données. De cette façon, la page se chargera rapidement et remplira les onglets lors de leur chargement. Vous pouvez également déplacer la logique dans le parent et envoyer les résultats aux enfants comme accessoires. De cette façon, vous pouvez prioriser les onglets qui seront chargés en premier. Ou mettez en cache les résultats et exécutez la logique uniquement la première fois qu'un composant est affiché.
Option 3: masquage de classe
Le masquage de classe est probablement le plus facile à implémenter. Comme mentionné, vous venez de créer une classe CSS avec display: none et attribuez la classe en fonction de prop. L'inconvénient est que le code entier de chaque composant caché est appelé et que tous les composants cachés sont attachés au DOM. (L'option 1 ne crée pas du tout les composants cachés. Et l'option 2 court-circuite le code inutile lorsque le composant est masqué et supprime complètement le composant du DOM.) Il semble que cela soit plus rapide pour basculer la visibilité selon certains tests effectués par des commentateurs sur d'autres réponses mais je ne peux pas en parler.
Option 4: un composant mais changez les accessoires. Ou peut-être aucun composant du tout et cache HTML.
Celui-ci ne fonctionnera pas pour toutes les applications et il est hors sujet car il ne s'agit pas de masquer des composants, mais il pourrait être une meilleure solution pour certains cas d'utilisation que de masquer. Disons que vous avez des onglets. Il pourrait être possible d'écrire un composant React et d'utiliser simplement les accessoires pour changer ce qui est affiché dans l'onglet. Vous pouvez également enregistrer le JSX dans des variables d'état et utiliser un accessoire pour décider quel JSX retourner dans la fonction de rendu. Si le JSX doit être généré, faites-le et mettez-le en cache dans le parent et envoyez le bon comme accessoire. Ou générer dans l'enfant et le mettre en cache dans l'état de l'enfant et utiliser des accessoires pour sélectionner celui qui est actif.
la source
C'est une belle façon d'utiliser le DOM virtuel :
Exemple ici
Utilisation des crochets React:
Exemple ici
la source
this.setState()
.Vous définissez une valeur booléenne dans l'état (par exemple, «show»), puis effectuez:
la source
La meilleure pratique est ci-dessous selon la documentation:
Rendre l'élément uniquement lorsque l'état est valide.
la source
la source
la source
Je commence par cette déclaration de l'équipe React:
Vous devez essentiellement montrer le composant lorsque le bouton est cliqué, vous pouvez le faire de deux manières, en utilisant Pure React ou en utilisant CSS, en utilisant Pure React, vous pouvez faire quelque chose comme le code ci-dessous dans votre cas, donc lors de la première exécution, les résultats ne sont pas affichés comme
hideResults
esttrue
, mais en cliquant sur le bouton, le changement va de l' Etat ethideResults
estfalse
et le get composant rendu à nouveau avec les nouvelles conditions de valeur, ceci est une utilisation très courante de changer vue des composants dans React ...Si vous souhaitez approfondir le rendu conditionnel dans React, jetez un œil ici .
la source
Exemple de masquage / affichage simple avec React Hooks: (essayez de ne pas jouer de violon)
la source
Si vous souhaitez voir comment faire basculer l'affichage d'un composant à la caisse de ce violon.
http://jsfiddle.net/mnoster/kb3gN/16387/
la source
Une méthode simple pour afficher / masquer des éléments dans React à l'aide de crochets
Maintenant, ajoutons un peu de logique à notre méthode de rendu:
Et
Bon travail.
la source
Dans certains cas, un composant d'ordre supérieur peut être utile:
Créez un composant d'ordre supérieur:
Étendez votre propre composant:
Ensuite, vous pouvez l'utiliser comme ceci:
Cela réduit un peu le passe-partout et impose de respecter les conventions de dénomination, mais sachez que MyComp sera toujours instancié - la façon d'omettre est mentionnée plus tôt:
{ !hidden && <MyComp ... /> }
la source
Utiliser le module rc-if-else
la source
Une façon pourrait être d'utiliser React
ref
et de manipuler la classe CSS à l'aide de l'API du navigateur. Son avantage est d'éviter de restituer dans React si le seul but est de masquer / afficher certains éléments DOM en cliquant sur un bouton.PS Corrigez-moi si je me trompe. :)
la source
Si vous utilisez bootstrap 4, vous pouvez masquer l'élément de cette façon
la source
Cela peut également être réalisé comme ceci (moyen très simple)
la source
cet exemple montre comment vous pouvez basculer entre les composants en utilisant une bascule qui bascule après chaque 1 seconde
la source
Utilisez cette syntaxe allégée et courte:
la source
Voici la solution simple, efficace et la meilleure avec un composant React sans classe pour afficher / masquer les éléments. Utilisation de React-Hooks qui est disponible dans le dernier projet create-react-app qui utilise React 16
Happy Coding :)
la source
la source
Vous pouvez utiliser le fichier css
et dans le fichier css
la source
la source
la source
la source
const
place devar
lorsque vous déclarez des constantes.