Tengo un problema relativamente sencillo al tratar de agregar secuencias de comandos en línea a un componente React. Lo que tengo hasta ahora:
'use strict';
import '../../styles/pages/people.scss';
import React, { Component } from 'react';
import DocumentTitle from 'react-document-title';
import { prefix } from '../../core/util';
export default class extends Component {
render() {
return (
<DocumentTitle title="People">
<article className={[prefix('people'), prefix('people', 'index')].join(' ')}>
<h1 className="tk-brandon-grotesque">People</h1>
<script src="https://use.typekit.net/foobar.js"></script>
<script dangerouslySetInnerHTML={{__html: 'try{Typekit.load({ async: true });}catch(e){}'}}></script>
</article>
</DocumentTitle>
);
}
};
También he intentado:
<script src="https://use.typekit.net/foobar.js"></script>
<script>try{Typekit.load({ async: true });}catch(e){}</script>
Ninguno de los enfoques parece ejecutar el script deseado. Supongo que es algo simple que me estoy perdiendo. ¿Alguien puede ayudar?
PD: Ignora el foobar, tengo una identificación real realmente en uso que no tenía ganas de compartir.
javascript
reactjs
ecmascript-6
react-jsx
ArrayKnight
fuente
fuente

DocumentTitle.Respuestas:
Editar: las cosas cambian rápido y esto está desactualizado - ver actualización
¿Desea buscar y ejecutar el script una y otra vez, cada vez que se representa este componente, o solo una vez cuando este componente se monta en el DOM?
Quizás intente algo como esto:
Sin embargo, esto solo es realmente útil si el script que desea cargar no está disponible como módulo / paquete. Primero, siempre:
npm install typekit)importel paquete donde lo necesito (import Typekit from 'typekit';)Esta es probablemente la forma en que instaló los paquetes
reactyreact-document-titlede su ejemplo, y hay un paquete Typekit disponible en npm .Actualizar:
Ahora que tenemos ganchos, un mejor enfoque podría ser usar
useEffectasí:Lo que lo convierte en un gran candidato para un gancho personalizado (por ejemplo:)
hooks/useScript.js:Que se puede usar así:
fuente
try{Typekit.load({ async: true });}catch(e){}después delappendChildcomponentDidMountfunción haya descargado y agregado el script a la página, tendrá los objetosjQueryy$disponibles a nivel mundial (es decir, activadowindow).Además de las respuestas anteriores, puede hacer esto:
El div está vinculado
thisy el script se inyecta en él.La demostración se puede encontrar en codesandbox.io
fuente
this.instancea la referencia dentro de su método de renderizado. He agregado un enlace de demostración para mostrar que funcionadocument,window. Así que prefiero usar elglobalpaquete npmMi forma favorita es usar React Helmet: es un componente que permite una fácil manipulación del cabezal del documento de una manera que probablemente ya esté acostumbrado.
p.ej
https://github.com/nfl/react-helmet
fuente
async="true"a la<script>etiqueta que agregó jQuery al código.async=truey falla sin él?Si necesita tener
<script>bloque en SSR (representación del lado del servidor), un enfoque concomponentDidMountno funcionará.Puedes usar
react-safebiblioteca en su lugar. El código en React será:fuente
La respuesta que proporcionó Alex Mcmillan me ayudó más, pero no funcionó para una etiqueta de script más compleja.
Modifiqué ligeramente su respuesta para encontrar una solución para una etiqueta larga con varias funciones que además ya estaba configurando "src".
(Para mi caso de uso, el script necesitaba vivir en la cabeza, lo que también se refleja aquí):
fuente
document.head.removeChild(script);su código, o creará un número infinito de etiquetas de script en su html siempre que el usuario visite esta ruta de la páginaCreé un componente React para este caso específico: https://github.com/coreyleelarson/react-typekit
Solo necesita pasar su ID de Kit Typekit como accesorio y ya está listo.
fuente
Hay una muy buena solución usando
Range.createContextualFragment.Esto funciona para HTML arbitrario y también retiene información de contexto como
document.currentScript.fuente
Puede usar
npm postscribepara cargar script en el componente reactfuente
También puedes usar reaccionar casco
Helmet toma etiquetas HTML simples y genera etiquetas HTML simples. Es muy simple, y reacciona amigable para principiantes.
fuente
para múltiples scripts, use esto
fuente
fuente
Puede encontrar la mejor respuesta en el siguiente enlace:
https://cleverbeagle.com/blog/articles/tutorial-how-to-load-third-party-scripts-dynamically-in-javascript
fuente
Según la solución de Alex McMillan , tengo la siguiente adaptación.
Mi propio entorno: React 16.8+, next v9 +
// agrega un componente personalizado llamado Script
// hooks / Script.js
// Use el componente personalizado, simplemente impórtelo y sustituya la antigua
<script>etiqueta en minúsculas por la etiqueta personalizada en camello<Script>.// index.js
fuente
Llegué un poco tarde a la fiesta, pero decidí crear la mía propia después de mirar las respuestas de @Alex Macmillan y eso fue al pasar dos parámetros adicionales; la posición en la que colocar los scripts como o y configurar el asíncrono en verdadero / falso, aquí está:
La forma de llamarlo es exactamente la misma que se muestra en la respuesta aceptada de esta publicación, pero con dos parámetros adicionales (nuevamente):
fuente
Para importar archivos JS en el proyecto de reacción, use este comando
Es simple y fácil.
En mi caso, me gustaría importar estos archivos JS en mi proyecto de reacción.
fuente
La solución depende del escenario. Como en mi caso, tuve que cargar una incrustación de calor dentro de un componente de reacción.
Calendly busca un div y lee de su
data-urlatributo y carga un iframe dentro de dicho div.Todo está bien cuando carga la página por primera vez: primero,
data-urlse representa div con . Luego, el script calendly se agrega al cuerpo. El navegador lo descarga y lo evalúa y todos volvemos felices a casa.El problema surge cuando navega y luego regresa a la página. Esta vez, el script aún está en el cuerpo y el navegador no lo vuelve a descargar ni a evaluar.
Reparar:
componentWillUnmountbuscar y eliminar el elemento de script. Luego, en el montaje, repita los pasos anteriores.$.getScript. Es un ingenioso asistente de jquery que toma un URI de script y una devolución de llamada exitosa. Una vez que el script se cargó, lo evalúa y dispara su devolución de llamada exitosa. Todo lo que tengo que hacer es en micomponentDidMount$.getScript(url). Mirendermétodo ya tiene el div calendly. Y funciona sin problemas.fuente