Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

105
Visualizações
Administre la visibilidad del componente secundario por enfoque principal en React

Tengo un componente de entrada de búsqueda en React, que también tiene muchas opciones. Quiero que el cuadro de opciones aparezca cuando la entrada esté enfocada o mientras haya interacción en el cuadro. Este cuadro debería desaparecer cuando se enfoca algo fuera de cualquiera de las entradas de búsqueda del cuadro. Por lo tanto, se comporta como un comportamiento bastante estándar.

Hay un problema que no estoy seguro de cómo resolver. Algunas de las acciones dentro del cuadro de opciones hacen que se represente otro componente dentro del cuadro, por lo que se pierde el foco (el navegador enfoca el <body> ). Mi componente piensa que significa ocultar el cuadro de opciones.

Encontré una solución para eso: solo escondo el cuadro si el blur del contenedor fue causado por algo externo. Funciona correctamente en algunos casos. Pero hay un problema cuando, digamos, hay un botón que hace que el cuadro de opciones muestre otra cosa, haciendo que el botón desaparezca. El foco va al <body> y ya no puedo ocultar el cuadro de opciones sin enfocar manualmente la entrada de búsqueda y luego enfocarme.

¿Existen algunas técnicas para gestionar la visibilidad por foco real o pseudo? En un escenario perfecto, me gustaría evitar enfocar programáticamente mi elemento, por dos razones:

  1. Me gustaría que el atributo de autofocus funcione correctamente.
  2. Realmente hay muchos componentes en un árbol para el cuadro de opciones; hacer que todos se enfoquen programáticamente significaría una gran cantidad de código repetitivo.

Para simplificar, eliminé los accesorios y elementos irrelevantes para la pregunta. Pero están sucediendo bastante cosas para el <OptionsBox /> .

Aquí está mi componente simplificado:

 import { useState } from 'react'; import OptionsBox from './OptionsBox'; export default function Search() { const [value, setValue] = useState(''); const [showOptions, setShowOptions] = useState(false); return ( <div tabIndex={-1} onFocus={() => setShowOptions(true)} onBlur={event => { const isChildFocused = event.currentTarget.contains(event.relatedTarget); if (!isChildFocused) { setShowOptions(false); } }} > <input type="text" value={value} onChange={event => setValue(event.target.value)} /> {showOptions && ( <OptionsBox /> )} </div> ); }
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Traté de encontrar alguna solución para trabajar en este problema y lo encontré de esta manera (en el enlace).

  • Envoltura principal de Autofocus (depende del requisito).
  • track the click event . Si está dentro, mantén el foco; de lo contrario, desenfoca el <OptionBox />

Aquí está el cambio que he hecho.
  • Se agregó ref a parentDiv y se lo pasó a <OptionBox/> para el seguimiento
  • Se agregaron 2 buttons para probar eventos de focus onClick
    • 1st onCLick para enfocar body
    • 2nd onClick para enfocar input dentro de <Parent/> / <OptionBox/>
  • Agregué un clickHandler para verificar, si el element en el que intenta enfocarse está dentro de parentDiv , si es así, mantenga el focus ; de lo contrario, blur y setState el Estado en false .

No estoy seguro de la eficiencia de esta solución, pero puede intentarlo (si aún no lo ha probado), ya que depende totalmente del caso de uso.

Enlace: https://codesandbox.io/s/youthful-hypatia-4mu2x?file=/src/OptionBox.js

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda