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

199
Vistas
Los observables RXJS cancelan el flujo de mouseover después del evento mouseout

Intentando implementar una tubería observable rxjs en React.

Ejemplo de Codesandbox -> https://codesandbox.io/s/optimistic-fog-xtdi4

Crear un elemento html (div) en React y vincular los eventos mouseover y mouseout.

Código de reacción para inicializar esto:

 useEffect(() => { const elMouseOut$ = fromEvent(elRef.current, "mouseout").subscribe(() => setState({ hover: "mouseout", eventType: "mouseout" }) ); const elMouseOver$ = fromEvent(elRef.current, "mouseover") .pipe(debounceTime(2000)) .subscribe(() => setState({ hover: "mouseover", eventType: "mouseover" }) ); return () => { elMouseOver$.unsubscribe(); elMouseOut$.unsubscribe(); }; }, []);

Criterios de aceptación Trámites.

  1. Cuando paso el mouse, después de un retraso de 2 segundos, necesito hacer una actualización de estado.
  2. Si saco el mouse en cualquier momento ANTES del retraso de 2 segundos, necesito cancelar la transmisión del mouseover y establecer algún estado. ( ESTE PASO ESTÁ ROTO )
  3. Si saco el mouse en cualquier momento DESPUÉS del retraso de 2 segundos, necesito establecer algún estado.
  4. Esto debería ser repetible, en el sentido de que si paso el mouse sobre, el mouse hacia fuera y el mouse sobre otra vez comenzamos desde el Paso 1.

He probado varias combinaciones diferentes de operadores, pero no puedo hacer que las cosas funcionen como se esperaba.

Nota: Si se cumple el tiempo de rebote del mouse sobre, se realiza una solicitud ajax.

Cualquier ayuda/consejo sería apreciado, simplemente no tengo las habilidades de rxjs para solucionar este problema.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Esto debería hacer el trabajo:

 useEffect(() => { const elMouseOver$ = fromEvent(elRef.current, "mouseover"); const elMouseOut$ = fromEvent(elRef.current, "mouseout"); const mouseoutSub = elMouseOver$.pipe( debounceTime(2000), tap(() => setState({ hover: 'mouseover', eventType: 'mouseover' })), switchMap(() => elMouseOut$), tap(() => setState({ hover: 'mouseout', eventType: 'mouseout' })), takeUntil(scheduled(elMouseOut$, asyncScheduler)), repeat() ); return () => mouseoutSub.unsubscribe(); }, []);

Caudal:

  • debounceTime : después de pasar el mouse, espere 2 segundos
  • tap - establecer el estado del mouseover
  • switchMap - escuchar elMouseOut$
  • tap - establece el estado mouseout
  • takeUntil : finaliza la transmisión cuando se produce el mouseout
  • repeat

Dado que switchMap y takeUntil usan la misma fuente, utilicé la scheduled dentro de takeUntil para que switchMap tuviera la oportunidad de emitir antes de que se completara el observable.


Aquí hay un StackBlitz que demuestra este comportamiento.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Solución CodeSandbox .


Creo que esta podría ser una forma de solucionarlo:

 const sub = merge( elMouseOver$.pipe( // Step 4) // Repeating the steps with the help of `switchMap` switchMap(() => timer(2000).pipe( // Step 2). // Cancelling the stream and setting some state(have a look at '3)', below). takeUntil(elMouseOut$), // Step 1). // This will be invoked if 2 seconds have passed after the mouseover event without // the mouseout event taking place. tap(() => setState({ hover: "mouseover", eventType: "mouseover" })), ) ) ), // Step 3). // Setting the state. elMouseOut$.pipe( tap(() => setState({ hover: "mouseout", eventType: "mouseout" })) ) ).subscribe();

Además, debido a que nos estamos suscribiendo a elMouseOut$ varias veces, es posible que desee utilizar el operador share() para que solo se agregue un detector de eventos:

 const elMouseOut$ = fromEvent(elRef.current, "mouseout").pipe( share(), );
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