html5-qrcode-react icon indicating copy to clipboard operation
html5-qrcode-react copied to clipboard

Multiple Instances opened when component is loaded

Open KimeraMoses opened this issue 2 years ago • 4 comments

image

This happens randomly and I can't figure out what's causing it.

KimeraMoses avatar Mar 20 '23 06:03 KimeraMoses

I have the same issue. When I refresh the page I get the same problem.

AnaGetovska avatar Mar 25 '23 20:03 AnaGetovska

i have the same issue too!!. At first i thought it was a bug from my end.

t-ega avatar Mar 27 '23 18:03 t-ega

In React, there is a thing called StrictMode. React StrictMode renders components twice in the development environment but not in production. This is to detect any problems with your code. useEffect itself will only be called once. StrictMode is automatically enabled in development mode, but you can disable it by removing the <React.StrictMode> wrapper from your index.js or App.js file or by commenting it out.

Source: https://youtu.be/k1Zyj4Qw56M

StrictMode

I hope this helps!

myromr avatar Mar 28 '23 15:03 myromr

I was able to overcome this issue from happening without disabling react strict mode by using the useRef hook.

Replace your HTML5QrcodePlugin component with the below code

const Html5QrcodePlugin = (props: any) => {
  const regionRef = useRef(null);
  const scannerRef = useRef<Html5QrcodeScanner | null>(null);

  useEffect(() => {
    if (!scannerRef.current) {
      // when component mounts
      const config = createConfig(props);
      const verbose = props.verbose === true;
      // Suceess callback is required.
      if (!props.qrCodeSuccessCallback) {
        throw 'qrCodeSuccessCallback is required callback.';
      }
      const html5QrcodeScanner = new Html5QrcodeScanner(qrcodeRegionId, config, verbose);
      scannerRef.current = html5QrcodeScanner;
    }

    const scanner = scannerRef.current;
    scanner.render(props.qrCodeSuccessCallback, props.qrCodeErrorCallback);

    // cleanup function when component will unmount
    return () => {
      scanner.clear().catch((error) => {
        console.error('Failed to clear html5QrcodeScanner. ', error);
      });
    };
  }, []);

  return <div ref={regionRef} id={qrcodeRegionId} />;
};

dovh-me avatar Feb 25 '24 23:02 dovh-me