Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

103
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda