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

153
Vistas
Reactividad cuando se agrega un elemento a DOM

Quiero integrar qr-scanner a mi proyecto. Esta biblioteca es capaz de decodificar códigos QR utilizando la cámara. Solo necesita la referencia a un elemento de video html y luego muestra la transmisión de la cámara web y, opcionalmente, algunos indicadores de un código QR que se encuentra en este elemento.

El componente más fácil sería algo como esto:

 import { useRef } from "react"; import QrScanner from "qr-scanner"; export const QrComponent = () => { const videoElement = useRef(null); const scanner = new QrScanner(videoElement.current, (result) => { console.log(result) }) return ( <video ref={videoElement} /> ) }

sin embargo, qr-scanner verifica si el elemento de destino pasado ya es parte del DOM :

 if (!document.body.contains(video)) { document.body.appendChild(video); shouldHideVideo = true; }

el elemento de video nunca se agregará al DOM, cuando se crea el objeto QrScanner. Esto lleva a que shouldHideVideo se establezca en verdadero, lo que deshabilita el video por completo más adelante en el código de la biblioteca.

Así que creo que necesito algún tipo de forma de reaccionar al elemento de video que se agrega al DOM. Pensé en usar un MutationObserver (y lo probé robando el gancho de esta página ), sin embargo, solo quería imprimir todas las mutaciones usando el gancho de esta manera:

 import { useRef, useCallback } from "react"; import QrScanner from "qr-scanner"; import { useMutationObservable } from "./useMutationObservable"; export const QrComponent = () => { const videoElement = useRef(null); const scanner = new QrScanner(videoElement.current, (result) => { console.log(result) }) const onMutation = useCallback((mutations) => console.log(mutations), []) useMutationObservable(document, onMutation) return ( <video ref={videoElement} /> ) }

sin embargo, nunca imprimí una sola línea, por lo que me parece que no hay mutaciones allí.

¿Quizás entendí algo mal? ¿Cómo puedo reaccionar ante el elemento de video que se agrega al documento?

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Ok, creo que no proporcioné suficiente información, pero lo descubrí por mi cuenta:

El MutationObserver no funciona, porque le dije que mirara document , ¡pero en realidad estoy dentro de un shadowdom con este componente en particular! Así que sospecho que no se detectarán mutaciones en el reino de las sombras.

Además, debido a que estoy dentro de un shadowdom, document.contains(videoElem.current) nunca será cierto. Entonces, en este caso particular, no tengo mejor opción que copiar el código de qr-scanner en mi árbol de proyecto y adaptarlo según sea necesario.

En otra nota: useLayoutEffect es un gancho de reacción, que está programado para ejecutarse después de las mutaciones DOM. Así que eso es lo que usaría si tuviera que empezar de nuevo con esta idea.

about 4 years ago · Santiago Trujillo 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