Je travaille sur un projet dans Next.js13 et j'essaie de créer un composant textarea personnalisé. Je souhaite que ce composant s'ajoute un écouteur d'événements (lui permettant d'ajuster automatiquement sa hauteur au fur et à mesure que l'utilisateur tape). Voici la partie du code pertinente à ce problème :
const textarea = ( <textarea id={id} className={styles.input} {...fieldProps} /> ); textarea.addEventListener("input", function(e){ this.style.height = "auto"; this.style.height = this.scrollHeight + "px"; }) return ( {textarea} )
Ce code génère les erreurs "TypeError : textarea.addEventListener n'est pas une fonction " et "La propriété 'addEventListener' n'existe pas sur le type 'Element'. " < /p>
Comment ajouter cet écouteur d'événement à la zone de texte créée par ce composant ?
Je souhaite que l'utilisateur puisse spécifier un identifiant (mais ce n'est pas obligatoire), donc je ne peux pas utiliser document.getElementById()
.
La réécriture de la ligne addEventListener comme suit élimine le "Property 'addEventListener' n'existe pas sur le type 'Element' ", mais le "TypeError: textarea.addEventListener n'est pas une fonction < /strong>" apparaît toujours :
(textarea as unknown as HTMLTextAreaElement).addEventListener("input", function(e){ this.style.height = "auto"; this.style.height = this.scrollHeight + "px"; })
Utiliser document.getElementsByTag('textarea')
puis parcourir en boucle toutes les zones de texte renvoyées et ajouter un écouteur d'événement fonctionne. Cependant, si j'ai plusieurs zones de texte sur une page, cela semble ajouter deux fois l'écouteur d'événement. Disons qu'il y a une zone de texte sur la page qui fait partie d'un composant différent et que je ne souhaite pas y ajouter cet écouteur d'événement.
Dans React, vous ne pouvez pas ajouter d'écouteurs d'événements directement aux éléments créés dans JSX comme vous le pouvez avec JavaScript normal. Au lieu de cela, vous devez gérer les événements à la manière de React en utilisant l'attribut onChange sur l'élément textarea.
TEXTAREA_COMPONENT.js
APP.js
Si vous souhaitez utiliser une bibliothèque au lieu d'implémenter cette fonctionnalité vous-même, il existe une excellente bibliothèque appelée react-textarea-autosize.
Si vous souhaitez l'implémenter vous-même, vous pouvez toujours utiliser ce référentiel comme guide.