L'ajout de balise de script pour Réagir/JSX
J'ai un relativement simple question d'essayer d'ajouter en ligne de script à Réagir composant. Ce que j'ai à ce jour:
'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>
);
}
};
J'ai aussi essayé:
<script src="https://use.typekit.net/foobar.js"></script>
<script>try{Typekit.load({ async: true });}catch(e){}</script>
Aucune approche semble exécuter le script souhaité. Je devine que c'est une chose simple, je suis absent. Quelqu'un peut-il vous aider?
PS: Ignorer le foobar, j'ai vraiment l'id en cours d'utilisation que je n'ai pas envie de partager.
- Existe-il une motivation pour le chargement via Réagir au lieu de l'inclure dans votre base de page HTML? Même si cela n'travail, cela signifie que vous sera ré-insertion d'un script à chaque fois que le composant monté.
- Est-ce le cas? Je suppose DOM de comparaison ce n'est pas le cas, mais j'avoue que cela dépendrait de la mise en œuvre de
DocumentTitle
. - Corriger @loganfsmyth, de Réagir ne sera pas recharger le script sur un nouveau rendu de si le prochain état a également le script.
Vous devez vous connecter pour publier un commentaire.
Voulez-vous de les chercher et d'exécuter le script, encore et encore, chaque fois que cette composante est rendue, ou qu'une fois, lorsque ce composant est monté dans le DOM?
Peut-être essayer quelque chose comme cela:
Toutefois, cela n'est vraiment utile si le script que vous souhaitez charger n'est pas disponible en tant que module/paquet. Tout d'abord, je voudrais toujours:
npm install typekit
)import
le paquet, où j'en ai besoin (import Typekit from 'typekit';
)C'est probablement la façon dont vous avez installé les paquets
react
etreact-document-title
à partir de votre exemple, et il y a un Typekit package disponible sur ngp.try{Typekit.load({ async: true });}catch(e){}
après laappendChild
componentDidMount
fonction a téléchargé et ajouté le script de la page, vous aurez lajQuery
et$
objets disponibles à l'échelle mondiale (c'est à dire: surwindow
).componentDidMount
ou il peut introduire funky rendre problèmes de. référence: reactjs.org/docs/react-component.html#componentdidmountsetState
ou de manipuler l'état du composant en aucune façon. Mais c'est certainement pas le "réagir de façon" soit - c'est un hack... et comme tous les hacks, est utile dans certaines situations.public
dossier,js/script.js
et puis à lasrc
point à ce que vous appelez normalement scripts deindex.html
...script.src = "js/script.js";
Davantage de les réponses ci-dessus, vous pouvez faire ceci:
La div est lié à
this
et le script est injecté dans il.De démonstration peut être trouvé sur codesandbox.io
this.instance
à la ref l'intérieur de votre méthode de rendu. J'ai ajouté un lien de démonstration pour montrer de travaildocument
est pas définidocument
,window
. Donc je préfère utiliser le mécanisme national de préventionglobal
paquetMa façon préférée consiste à utiliser Réagir Casque – c'est un composant qui permet une manipulation facile de la section head du document dans une manière que vous êtes probablement déjà utilisé pour.
par exemple
https://github.com/nfl/react-helmet
async="true"
à la<script>
balise ajoutée jQuery pour le code.async=true
et échoue sans elle?helmet
composant dans cet exemple est normal descript
éléments comme ses enfants. Donc, tant que lasrc
correctement vos fichiers en local, il va fonctionner. Si vous éprouvez des difficultés à résoudre les scripts dans votre projet, assurez-vous que webpack ou celui de construire des outils que vous utilisez sont le regroupement de ces fichiers quelque part, vous pouvez les utiliser.Si vous avez besoin d'avoir
<script>
bloc en SSR (rendu côté serveur), une approche aveccomponentDidMount
ne fonctionnera pas.Vous pouvez utiliser
réagissent-safe
de la bibliothèque de la place.Le code de Réagir sera:
J'ai créé une Réagir la composante pour ce cas précis: https://github.com/coreyleelarson/react-typekit
Juste besoin de passer dans votre Typekit Kit ID comme un accessoire et vous êtes bon pour aller.
La réponse Alex Mcmillan fourni m'a le plus aidé, mais n'a pas assez de travail pour un script plus complexe de la balise.
J'ai légèrement modifié sa réponse à venir avec une solution à un tag avec différentes fonctions qui a en outre déjà paramètre "src".
(Pour mon cas d'utilisation le script nécessaire pour vivre dans la tête qui se traduit ici en tant que bien):
Il y a une très belle solution de contournement à l'aide de
Range.createContextualFragment
.Cela fonctionne pour HTML arbitraire et conserve également les informations de contexte tels que
document.currentScript
.Vous pouvez utiliser
npm postscribe
pour charger le script de réagir composantJ'ai eu
document "undefined"
lors de l'actualisation. J'ai donc essayé de cette façonpour plusieurs scripts, utilisez ce
Solution dépend de scénario. Comme dans mon cas, j'ai eu à charge un calendly intégrer à l'intérieur d'une réagir composant.
Calendly recherche un div et de lectures à partir c'est
data-url
attribut et les charges d'une iframe à l'intérieur de ladite div.C'est tout bon lors du premier chargement de la page: tout d'abord, div avec
data-url
est rendu. Puis calendly script est ajouté à corps. Navigateur télécharge et l'évalue et nous avons tous rentrer à la maison heureux.Problème vient quand vous la quittez puis revenez dans la page. Cette fois, le script est toujours dans le corps et le navigateur n'a pas re-télécharger & re-évaluer.
Correctif:
componentWillUnmount
trouver et supprimer l'élément script. Ensuite, sur la reconstitution de la montagne, répétez les étapes ci-dessus.$.getScript
. C'est une chouette jquery helper qui prend un script URI et un succès de rappel. Une fois le script chargé, il les évalue et les feux de votre succès de rappel. Tout ce que j'ai à faire est de moncomponentDidMount
$.getScript(url)
. Monrender
méthode a déjà le calendly div. Et il fonctionne en douceur.