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

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

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 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!