0
votes

Ref null Inside Popover

J'essaie d'autofocus un élément d'entrée sur l'ouverture d'une popover. Voici le sandbox pour celui-ci: HTTPS: // Codesandbox. io / s / green-bash-x6bj4? File = / src / app.js

problème ici est que la propriété actuelle est toujours nulle sur REF. Est-ce un cas où le transparent pourrait aider? Je ne suis pas très conscient de cela, alors postez-le.

Toute aide est très appréciée.


2 commentaires

On dirait que le contenu de POPOVER n'est pas monté, ce qui signifie que le n'existe pas encore lorsque vous exécutez le handleclick


Comme Adam a dit, vous aurez déplacer votre .focus () appelle à une fois que le bouton a été cliqué, probablement dans un useeffect ou quelque chose. L'élément d'entrée est attribué à la réferée après sa clic, vous ne pouvez donc pas vous concentrer avant que la pondérale ne soit ouverte.


3 Réponses :


1
votes

Pas besoin d'utiliser une référence pour cela, il suffit d'ajouter une autofocasse à votre entrée:

<input autoFocus placeholder="search" />


2 commentaires

Cela fonctionne lorsque je le fais sur votre codesandbox. Assurez-vous de taper la mise au point automatique correctement (F est majuscule)


Cela fonctionne réellement. Parfois, nous ignorons les trucs mineurs et surchargent des choses. Merci mon pote.



1
votes

Puisque vous contrôlez le Ouvrir code> via Etat, qui est asynchronisé, lorsque le INPUTREF code> tente d'obtenir l'élément, l'état n'a pas été mis à jour et le Bon code> Les enfants n'ont pas été créés.

Vous pouvez ajouter une asynchronisation / attendre au setState code> pour le faire fonctionner. P>

const handleClick = async event => {
  await setAnchorEl(event.currentTarget);
  inputRef.current.focus();
};


2 commentaires

Belle façon de l'approcher. + 1


@Aakashthakur, je corrige simplement la faute à l'intérieur du code et s'il y a d'autres outils comme celui-ci, remarquez ce type de problème aiderait à deviner



0
votes

Vous pouvez simplement ajouter un rappel après l'instate, comme ceci:

    this.setState(
      {
        anchorEl: e.currentTarget,
        isPopoverOpen: true,
      },
      () => {
        setTimeout(() => {
          if (this.inputRef.current) {
            return this.inputRef.current.focus();
          }

          return null;
        }, 200);
      }
    );
  };


0 commentaires