Mam stosunkowo prosty problem z dodaniem wbudowanego skryptu do komponentu React. Co mam do tej pory:
'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>
);
}
};
Próbowałem też:
<script src="https://use.typekit.net/foobar.js"></script>
<script>try{Typekit.load({ async: true });}catch(e){}</script>
Żadne z tych podejść nie wydaje się wykonywać żądanego skryptu. Zgaduję, że tęsknię za prostą rzeczą. Czy ktoś może pomóc?
PS: Zignoruj foobar, mam naprawdę używany identyfikator, którego nie chciałem się dzielić.
javascript
reactjs
ecmascript-6
react-jsx
ArrayKnight
źródło
źródło
DocumentTitle
.Odpowiedzi:
Edycja: Rzeczy zmieniają się szybko, a to jest przestarzałe - patrz aktualizacja
Czy chcesz pobierać i uruchamiać skrypt za każdym razem, gdy ten komponent jest renderowany, czy tylko raz, gdy ten komponent jest montowany w DOM?
Być może spróbuj czegoś takiego:
Jest to jednak bardzo pomocne tylko wtedy, gdy skrypt, który chcesz załadować, nie jest dostępny jako moduł / pakiet. Po pierwsze, zawsze:
npm install typekit
)import
pakiet, w którym go potrzebuję (import Typekit from 'typekit';
)Jest to prawdopodobnie sposób, w jaki zainstalowałeś pakiety
react
ireact-document-title
z twojego przykładu, a na przykład jest dostępny pakiet Typekit .Aktualizacja:
Teraz, gdy mamy haczyki, lepszym rozwiązaniem może być użycie
useEffect
takiego:Co czyni go doskonałym kandydatem na niestandardowy hak (np .
hooks/useScript.js
:):Które można wykorzystać tak:
źródło
try{Typekit.load({ async: true });}catch(e){}
appendChild
componentDidMount
pobraniu i dołączeniu skryptu przez funkcję do strony będziesz mieć globalnie dostępne obiektyjQuery
i$
(tj. Włączonewindow
).W odpowiedzi na powyższe odpowiedzi możesz to zrobić:
Div jest związany
this
i skrypt jest do niego wstrzykiwany.Demo można znaleźć na codeandbox.io
źródło
this.instance
się z ref w swojej metodzie renderowania. Dodałem link demonstracyjny, aby pokazać, że działadocument
,window
. Wolę więc używaćglobal
pakietu npmMoim ulubionym sposobem jest użycie React Helmet - jest to komponent, który pozwala na łatwą manipulację głowicą dokumentu w sposób, w jaki prawdopodobnie już jesteś przyzwyczajony.
na przykład
https://github.com/nfl/react-helmet
źródło
async="true"
do<script>
znacznika, który dodał jQuery do kodu.async=true
bez niego i bez niego?Jeśli potrzebujesz mieć
<script>
blok w SSR (renderowanie po stronie serwera), podejście zcomponentDidMount
nie będzie działać.Zamiast tego możesz użyć
react-safe
biblioteki. Kod w React będzie:źródło
Odpowiedź udzielona przez Alexa Mcmillana najbardziej pomogła mi, ale nie całkiem działała w przypadku bardziej złożonego skryptu.
Lekko poprawiłem jego odpowiedź, aby znaleźć rozwiązanie dla długiego tagu z różnymi funkcjami, które dodatkowo ustawiały już „src”.
(W moim przypadku użycia skrypt musiał żyć w głowie, co również zostało odzwierciedlone tutaj):
źródło
document.head.removeChild(script);
w kodzie, czy będzie tworzyć nieskończoną liczbę tagu skrypt na swojej html Dopóki wizyt użytkowników tej strony trasyUtworzyłem komponent React dla tego konkretnego przypadku: https://github.com/coreyleelarson/react-typekit
Wystarczy podać identyfikator zestawu Typekit jako rekwizyt i możesz już iść.
źródło
Istnieje bardzo przyjemne obejście
Range.createContextualFragment
.Działa to w przypadku dowolnego kodu HTML, a także zachowuje informacje kontekstowe, takie jak
document.currentScript
.źródło
Możesz użyć
npm postscribe
do załadowania skryptu w komponencie reagującymźródło
Możesz także użyć kasku reagującego
Hełm pobiera zwykłe tagi HTML i generuje zwykłe tagi HTML. To bardzo proste i React przyjazne dla początkujących.
źródło
w przypadku wielu skryptów użyj tego
źródło
źródło
Najlepszą odpowiedź znajdziesz pod następującym linkiem:
https://cleverbeagle.com/blog/articles/tutorial-how-to-load-third-party-scripts-dynamically-in-javascript
źródło
Według rozwiązania Alexa McMillana mam następującą adaptację.
Moje własne środowisko: Reakcja 16.8+, następne v9 +
// dodaj niestandardowy komponent o nazwie Script
// hooks / Script.js
// Użyj niestandardowego komponentu, wystarczy go zaimportować i zastąpić stary
<script>
znacznik małymi literami niestandardowym<Script>
znacznikiem wielbłąda .// index.js
źródło
Trochę późno na imprezę, ale postanowiłem stworzyć swój własny, po zapoznaniu się z odpowiedziami na @Alex Macmillan i to przez przekazanie dwóch dodatkowych parametrów; pozycja, w której należy umieścić skrypty takie jak lub i ustawić asynchronię na true / false, tutaj jest:
Sposób wywołania jest dokładnie taki sam, jak pokazano w zaakceptowanej odpowiedzi tego postu, ale z dwoma dodatkowymi (ponownie) parametrami:
źródło
Aby zaimportować pliki JS w projekcie Reaguj, użyj tego polecenia
To proste i łatwe.
W moim przypadku chciałbym zaimportować te pliki JS do mojego projektu reagowania.
źródło
Rozwiązanie zależy od scenariusza. Tak jak w moim przypadku musiałem załadować kalendarz osadzony w elemencie reagującym.
Calendly szuka div i czyta z jego
data-url
atrybutu i ładuje iframe wewnątrz tego div.Wszystko jest dobrze, gdy ładujesz stronę po raz pierwszy: po pierwsze
data-url
renderowany jest div z . Następnie skrypt dodaje kalendarz do treści. Przeglądarka pobiera ją i ocenia, a my wszyscy wracamy do domu zadowoleni.Problem pojawia się, gdy opuścisz stronę, a następnie wrócisz na stronę. Tym razem skrypt jest nadal w treści, a przeglądarka go nie pobiera i nie ocenia ponownie.
Naprawić:
componentWillUnmount
znajdowaniu i usuwaniu elementu skryptu. Następnie przy ponownym montażu powtórz powyższe kroki.$.getScript
. To sprytny pomocnik jquery, który pobiera identyfikator URI skryptu i oddzwanianie. Po załadowaniu skryptu ocenia go i uruchamia wywołanie zwrotne powodzenia. Wszystko co muszę zrobić, to w moimcomponentDidMount
$.getScript(url)
. Mojarender
metoda ma już div kalendarza. I działa płynnie.źródło