Estoy tratando de importar un script llamado Mollie (usado para pagos), pero no estoy seguro de cómo hacerlo en React. Normalmente en Javascript harías algo como esto:
<html> <head> <title>My Checkout</title> </head> <body> <script src="https://js.mollie.com/v1/mollie.js"></script> </body> </html>He intentado esto (según otras publicaciones de Stackoverflow)
useEffect(() => { const script = document.createElement("script"); script.src = "https://js.mollie.com/v1/mollie.js"; script.addEventListener("load", () => setScriptLoaded(true)); document.body.appendChild(script); }, []); const mollie = Mollie(); // Mollie is not defined Pero entonces Mollie no está definida. ¿Alguien puede señalar en la dirección correcta sobre cómo import Mollie en React?
Estoy siguiendo esta guía (pero es para Javascript estándar)
el punto aquí es que el efecto se invoca después de que el componente de reacción se monte y se presente al usuario. La siguiente línea en la que intenta llamar a Mollie, de hecho, se ejecuta antes cuando el componente se está construyendo pero aún no se procesa.
Hay varias opciones de lo que puede hacer al respecto:
// MollieExample.jsx const MollieExample = () => { const [mollie, setMollie] = useState(); useEffect(() => { const script = document.createElement('script'); script.src = 'https://js.mollie.com/v1/mollie.js'; script.addEventListener("load", () => { setMollie(window.Mollie(/* Mollie arguments */); }); document.body.appendChild(script); }, []); useEffect(() => { if (mollie) { console.log('Mollie exists here'); console.log(typeof mollie); } } , [mollie]); return <p>typeof mollie: {typeof mollie}</p>; }; // useMollie.js let molliePromise; const useMollie = (effect, deps) => { const [mollie, setMollie] = useState(); const mollieCb = useCallback((mollie) => effect(mollie), deps); useEffect(() => { if (!molliePromise) { molliePromise = new Promise((resolve) => { const script = document.createElement("script"); script.src = "https://js.mollie.com/v1/mollie.js"; script.addEventListener("load", () => { resolve(window.Mollie(/* Mollie arguments */); }); document.body.appendChild(script); }); } molliePromise.then((mollie) => setMollie(mollie)); }, []); useEffect(() => { if (mollie) { mollieCb(mollie); } }, [mollie, mollieCb]); }; // MollieConsumer.jsx const MollieConsumer = () => { useMollie((mollie) => { console.log('Mollie exists here'); console.log(typeof mollie); }, [/* useMollie effect callback dependencies array */]); return ( <p>Mollie consumer</p> ); }; // App.jsx function App() { /* Both consumers use the same instance of Mollie */ return ( <div> <MollieConsumer/> <MollieConsumer/> </div> ); }Supongo que terminarás usando alguna opción intermedia. Por ejemplo, con la importación de secuencias de comandos en index.html (o cualquier otro tipo de página HTML que tenga que contenga el elemento host de la aplicación React) y el gancho global.