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
)import
el paquete donde lo necesito (import Typekit from 'typekit';
)Esta es probablemente la forma en que instaló los paquetes
react
yreact-document-title
de su ejemplo, y hay un paquete Typekit disponible en npm .Actualizar:
Ahora que tenemos ganchos, un mejor enfoque podría ser usar
useEffect
así: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 delappendChild
componentDidMount
función haya descargado y agregado el script a la página, tendrá los objetosjQuery
y$
disponibles a nivel mundial (es decir, activadowindow
).Además de las respuestas anteriores, puede hacer esto:
El div está vinculado
this
y el script se inyecta en él.La demostración se puede encontrar en codesandbox.io
fuente
this.instance
a 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 elglobal
paquete 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=true
y falla sin él?Si necesita tener
<script>
bloque en SSR (representación del lado del servidor), un enfoque concomponentDidMount
no funcionará.Puedes usar
react-safe
biblioteca 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 postscribe
para 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-url
atributo y carga un iframe dentro de dicho div.Todo está bien cuando carga la página por primera vez: primero,
data-url
se 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:
componentWillUnmount
buscar 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)
. Mirender
método ya tiene el div calendly. Y funciona sin problemas.fuente