J'ai un problème relativement simple d'essayer d'ajouter des scripts en ligne à un composant React. Ce que j'ai jusqu'à présent:
'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 des deux approches ne semble exécuter le script souhaité. Je suppose que c'est une chose simple qui me manque. Quelqu'un peut-il m'aider?
PS: Ignorez le foobar, j'ai un vrai identifiant réellement utilisé que je n'ai pas envie de partager.
javascript
reactjs
ecmascript-6
react-jsx
ArrayKnight
la source
la source
DocumentTitle
.Réponses:
Edit: Les choses changent rapidement et ce n'est plus à jour - voir la mise à jour
Voulez-vous récupérer et exécuter le script encore et encore, à chaque fois que ce composant est rendu, ou une seule fois lorsque ce composant est monté dans le DOM?
Essayez peut-être quelque chose comme ceci:
Cependant, cela n'est vraiment utile que si le script que vous souhaitez charger n'est pas disponible en tant que module / package. Premièrement, je voudrais toujours:
npm install typekit
)import
le package où j'en ai besoin (import Typekit from 'typekit';
)C'est probablement la façon dont vous avez installé les packages
react
et àreact-document-title
partir de votre exemple, et un package Typekit est disponible sur npm .Mettre à jour:
Maintenant que nous avons des crochets, une meilleure approche pourrait être d'utiliser
useEffect
comme ceci:Ce qui en fait un excellent candidat pour un crochet personnalisé (par exemple:)
hooks/useScript.js
:Qui peut être utilisé comme ceci:
la source
try{Typekit.load({ async: true });}catch(e){}
after theappendChild
componentDidMount
fonction a téléchargé et ajouté le script à la page, vous aurez les objetsjQuery
et$
disponibles globalement (c'est-à-dire: onwindow
).En plus des réponses ci-dessus, vous pouvez faire ceci:
Le div est lié à
this
et le script y est injecté.La démo peut être trouvée sur codesandbox.io
la source
this.instance
à la référence dans votre méthode de rendu. J'ai ajouté un lien de démonstration pour montrer qu'il fonctionnedocument
,window
. Je préfère donc utiliser leglobal
package npmMa façon préférée est d'utiliser React Helmet - c'est un composant qui permet une manipulation facile de la tête du document d'une manière que vous avez probablement déjà utilisée.
par exemple
https://github.com/nfl/react-helmet
la source
async="true"
à la<script>
balise qui a ajouté jQuery au code.async=true
et échoue sans lui?Si vous devez avoir un
<script>
bloc en SSR (rendu côté serveur), une approche aveccomponentDidMount
ne fonctionnera pas.Vous pouvez utiliser la
react-safe
bibliothèque à la place. Le code dans React sera:la source
La réponse d' Alex Mcmillan m'a le plus aidé mais n'a pas vraiment fonctionné pour une balise de script plus complexe.
J'ai légèrement modifié sa réponse pour trouver une solution pour une longue balise avec diverses fonctions qui définissait en outre déjà "src".
(Pour mon cas d'utilisation, le script devait vivre dans la tête, ce qui se reflète également ici):
la source
document.head.removeChild(script);
votre code, ou vous créerez un nombre infini de balises de script à votre html tant que l'utilisateur visite cet itinéraire de pageJ'ai créé un composant React pour ce cas spécifique: https://github.com/coreyleelarson/react-typekit
Il vous suffit de passer votre ID de kit Typekit comme accessoire et vous êtes prêt à partir.
la source
Il existe une solution de contournement très agréable à utiliser
Range.createContextualFragment
.Cela fonctionne pour du HTML arbitraire et conserve également des informations de contexte telles que
document.currentScript
.la source
Vous pouvez utiliser
npm postscribe
pour charger le script dans le composant Reactla source
Vous pouvez également utiliser le casque React
Le casque prend des balises HTML simples et génère des balises HTML simples. C'est très simple et React est adapté aux débutants.
la source
pour plusieurs scripts, utilisez ceci
la source
la source
Vous pouvez trouver la meilleure réponse sur le lien suivant:
https://cleverbeagle.com/blog/articles/tutorial-how-to-load-third-party-scripts-dynamically-in-javascript
la source
Selon la solution d' Alex McMillan , j'ai l'adaptation suivante.
Mon propre environnement: React 16.8+, next v9 +
// ajouter un composant personnalisé nommé Script
// hooks / Script.js
// Utilisez le compoennt personnalisé, importez-le simplement et remplacez l'ancienne
<script>
balise minuscule par la balise camel personnalisée<Script>
suffirait.// index.js
la source
Un peu tard pour la fête mais j'ai décidé d'en créer une après avoir regardé les réponses de @Alex Macmillan et c'était en passant deux paramètres supplémentaires; la position dans laquelle placer les scripts tels que or et la configuration de l'async sur true / false, la voici:
La façon de l'appeler est exactement la même que celle indiquée dans la réponse acceptée de ce post, mais avec deux (supplémentaires) paramètres supplémentaires:
la source
Pour importer des fichiers JS dans le projet React, utilisez cette commange
C'est simple et facile.
Dans mon cas, je voudrais importer ces fichiers JS dans mon projet React.
la source
La solution dépend du scénario. Comme dans mon cas, j'ai dû charger une intégration calendaire à l'intérieur d'un composant React.
Calendly recherche un div et lit à partir de son
data-url
attribut et charge un iframe à l'intérieur dudit div.Tout va bien lorsque vous chargez la page pour la première fois: d'abord, div avec
data-url
est rendu. Ensuite, un script calendaire est ajouté au corps. Le navigateur le télécharge et l'évalue et nous rentrons tous chez nous heureux.Le problème survient lorsque vous vous éloignez puis revenez dans la page. Cette fois, le script est toujours dans le corps et le navigateur ne le télécharge pas et ne le réévalue pas.
Réparer:
componentWillUnmount
rechercher et supprimer l'élément de script. Ensuite, lors du remontage, répétez les étapes ci-dessus.$.getScript
. Il s'agit d'une aide jquery astucieuse qui prend un URI de script et un rappel de réussite. Une fois le script chargé, il l'évalue et déclenche votre rappel de réussite. Tout ce que j'ai à faire, c'est dans moncomponentDidMount
$.getScript(url)
. Marender
méthode a déjà le div calendaire. Et ça marche bien.la source