Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

161
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!