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

157
Vistas
No se puede alternar un componente por segunda vez usando detectores de eventos

Puede encontrar los códigos y la caja aquí .

Tengo un componente que hace lo siguiente:

  1. Mostrar un icono
  2. Si se hace clic en el icono, entonces, en su lugar, muestra una entrada de búsqueda.
  3. Si el usuario hace clic en cualquier lugar fuera de la entrada de búsqueda mientras se muestra, oculte la entrada de búsqueda y vuelva a mostrar el icono en su lugar.

El problema es que después de hacer clic en el ícono, la entrada de búsqueda se muestra y al hacer clic en cualquier lugar fuera de la entrada de búsqueda se muestra el ícono nuevamente. Pero si vuelve a hacer clic en el icono por segunda vez, la entrada de búsqueda no se muestra.

Intenté adjuntar una referencia al ícono y evaluar si el evento está contenido cuando se hace clic en el ícono, pero esa declaración condicional no ayudó. ¿Cómo puedo asegurarme de que cuando hago clic en el ícono para más veces, la entrada aparece nuevamente? ¡Gracias!

 import ReactDOM from "react-dom"; import "@elastic/eui/dist/eui_theme_amsterdam_light.css"; import React, { useEffect, useRef, useState } from "react"; import { EuiButtonIcon, EuiFieldText } from "@elastic/eui"; const App = () => { const [showSearch, setShowSearch] = useState(false); const searchInputRef = useRef(null); useEffect(() => { document.addEventListener( "click", (event) => handleClickOutside(event, showSearch), false ); }, [showSearch]); useEffect( () => () => { document.removeEventListener( "click", (event) => handleClickOutside(event, false), false ); }, [] ); const handleClickOutside = (event, showSearch) => { if ( searchInputRef.current && !searchInputRef.current.contains(event.target) && showSearch ) { setShowSearch(false); } }; if (showSearch) { return ( <EuiFieldText icon="search" placeholder="Sample Search Placeholder ..." inputRef={searchInputRef} /> ); } return ( <EuiButtonIcon aria-label="button" iconType="search" iconSize="xxl" onClick={() => setShowSearch(true)} /> ); }; export default App;
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Creo que su enfoque fue correcto, todo lo que cambié fueron las funciones useEffect .

Acabo de eliminar la otra función useEffect que utilizó para eliminar el evento de click .

También pasé la opción once al detector de eventos, por lo que el evento se eliminaría después de ejecutarse una vez.

 useEffect(() => { const handleClickOutside = () => document.addEventListener("click", ({ target }) => { if (searchInputRef.current?.contains(target) === false && showSearch === true) setShowSearch(false); else handleClickOutside(); }, { once: true }); handleClickOutside(); }, [showSearch]);

Editar código deslumbrante

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