Comment puis-je configurer un bouton pour allumer et éteindre tous les accordéons ?
P粉391677921
2023-08-30 16:57:51
<p>J'ai un composant qui crée un accordéon pliable en utilisant le code suivant : </p>
<pre class="brush:php;toolbar:false;">importer React, {useState} depuis 'react';
const Collapsible = (accessoires) =>{
const [open, setOpen] = useState(false);
const bascule = () =>
setOpen(!ouvert);
}
retour(
<div>
<button className={props.level} onClick={toggle}>{props.label}</button>
{ouvrir &&
<div className="toggle">
{accessoires.enfants}
</div>
)}
</div>
)
}
exporter par défaut Pliable ;</pre>
<p>Je l'utilise à plusieurs endroits dans l'application principale et parfois dans d'autres accordéons. Dans plusieurs cas, je n'avais en fait aucune idée du nombre d'accordéons qu'il y aurait sur la page, car ils étaient rendus dynamiquement en fonction des données. Dans cet esprit, je souhaite créer un bouton dans l'application principale qui active (et désactive) tous les accordéons sans avoir à définir un nombre fixe et sans avoir à restituer tous les accordéons dans l'application principale (c'est-à-dire certains accordéons dans d'autres composants). puis importé dans l'application principale). </p>
<p>J'ai essayé d'utiliser des crochets de référence pour y parvenir : </p>
<ol>
<li>Ajoutez une référence dans le bouton du composant pliable et accédez-y depuis le composant parent via les accessoires : </li>
</ol>
<pre class="brush:php;toolbar:false;"><button className={props.level} onClick={toggle} ref={props.innerRef}>{props.label}</button> ;</pré>
<ol start="2">
<li>Ajoutez la référence suivante dans l'application principale : </li>
</ol>
<pre class="brush:php;toolbar:false;">const childRef = useRef();
const openClick = () =>
childRef.state = vrai ;
}
const closeClick = () =>
childRef.state = faux ;
}</pré>
<ol start="3">
<li>Utilisez les boutons suivants dans l'application principale : </li>
</ol>
<pre class="brush:php;toolbar:false;"><bouton onClick = {openClick}>
Développer tout
</bouton>
<bouton onClick = {closeClick}>
Tout réduire
</bouton></pre>
<ol start="4">
<li>Ajouter une référence à l'accordéon lors du rendu : </li>
</ol>
<pre class="brush:php;toolbar:false;"><Collapsible label="" level="content" innerRef={childRef}></pre>
<p>En réalité, cela ne fait rien, probablement parce que la façon dont j'essayais d'accéder à l'état à l'étape 2 était erronée, mais j'ai pensé que cela valait la peine d'essayer...</p>
<p>Des idées pour savoir si cela est possible ? </p>
Vous pouvez utiliser
Redux
.openAllAccordions
, parcourez les identifiants et définissez l'accordéon appartenant à cet identifiant sur open=truecloseAllAccordions
, parcourez les identifiants et définissez l'accordéon appartenant à cet identifiant sur open=falseDans une collection plus ou moins arbitraire d'instances de composants, il est courant d'avoir besoin d'une certaine coordination. Une approche que j'ai utilisée avec succès consiste à créer un Context avec un hook associé avec lequel les composants peuvent être enregistrés. Ce hook renvoie une vue de l'état partagé et une fonction qui modifie cet état en fonction de vos besoins.
Ici, vous pouvez créer un contexte qui stocke les
opener
函数并提供openAll
/closeAll
fonctions pour chaque composant enregistré :...Il existe également un hook appelé par chaque composant enfant pour s'enregistrer dans le contexte et renvoyer la valeur
toggle
/open
familière :Il existe également un hook séparé pour effectuer des opérations par lots, ce qui est également pratique :
Bac à sable
Veuillez noter que par souci de simplicité, une fonction
opener
(又名setOpen
) distincte est utilisée ici comme identifiant unique pour chaque composant enregistré. Une alternative flexible consiste à utiliser d'autres identifiants afin de pouvoir ouvrir/fermer des accordéons arbitraires dans la navigation, etc.