Saya memiliki masalah yang relatif mudah mencoba menambahkan skrip sebaris ke komponen Bereaksi. Apa yang saya miliki sejauh ini:
'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>
);
}
};
Saya juga sudah mencoba:
<script src="https://use.typekit.net/foobar.js"></script>
<script>try{Typekit.load({ async: true });}catch(e){}</script>
Tidak ada pendekatan yang menjalankan skrip yang diinginkan. Saya kira itu hal sederhana yang saya lewatkan. Adakah yang bisa membantu?
PS: Abaikan foobar itu, sebenarnya saya punya id yang sebenarnya saya tidak suka berbagi.
javascript
reactjs
ecmascript-6
react-jsx
ArrayKnight
sumber
sumber
DocumentTitle
.Jawaban:
Sunting: Hal berubah dengan cepat dan ini sudah ketinggalan zaman - lihat pembaruan
Apakah Anda ingin mengambil dan menjalankan skrip berulang kali, setiap kali komponen ini dirender, atau hanya sekali ketika komponen ini dipasang ke DOM?
Mungkin coba sesuatu seperti ini:
Namun, ini hanya sangat membantu jika skrip yang ingin Anda muat tidak tersedia sebagai modul / paket. Pertama, saya akan selalu:
npm install typekit
)import
paket tempat saya membutuhkannya (import Typekit from 'typekit';
)Ini kemungkinan cara Anda menginstal paket
react
danreact-document-title
dari contoh Anda, dan ada paket Typekit yang tersedia di npm .Memperbarui:
Sekarang kita memiliki kait, pendekatan yang lebih baik mungkin digunakan
useEffect
seperti:Yang menjadikannya kandidat yang tepat untuk pengait kustom (mis .:)
hooks/useScript.js
:Yang bisa digunakan seperti ini:
sumber
try{Typekit.load({ async: true });}catch(e){}
setelahappendChild
componentDidMount
fungsi mengunduh dan menambahkan skrip ke halaman, Anda akan memilikijQuery
dan$
objek tersedia secara global (mis .: aktifwindow
).Lebih jauh ke jawaban di atas Anda dapat melakukan ini:
Div terikat
this
dan skrip disuntikkan ke dalamnya.Demo dapat ditemukan di codesandbox.io
sumber
this.instance
ref di dalam metode render Anda. Saya telah menambahkan tautan demo untuk menunjukkannya berfungsidocument
,window
. Jadi saya lebih suka menggunakanglobal
paket npmCara favorit saya adalah menggunakan React Helmet - ini adalah komponen yang memungkinkan manipulasi kepala dokumen dengan mudah dengan cara yang mungkin sudah biasa Anda lakukan.
misalnya
https://github.com/nfl/react-helmet
sumber
async="true"
ke<script>
tag yang ditambahkan jQuery untuk kode.async=true
dan gagal tanpanya?Jika Anda perlu memiliki
<script>
blok di SSR (rendering sisi-server), pendekatan dengancomponentDidMount
tidak akan berfungsi.Anda dapat menggunakan
react-safe
perpustakaan sebagai gantinya. Kode dalam Bereaksi adalah:sumber
Jawabannya Alex Mcmillan membantu saya tetapi tidak cukup berhasil untuk tag skrip yang lebih kompleks.
Saya sedikit mengutak-atik jawabannya untuk menghasilkan solusi untuk tag panjang dengan berbagai fungsi yang juga sudah diatur "src".
(Untuk kasus penggunaan saya, skrip harus hidup dalam kepala yang tercermin di sini juga):
sumber
document.head.removeChild(script);
kode Anda, atau Anda akan membuat jumlah tag script yang tak terbatas di html Anda selama pengguna mengunjungi rute halaman iniSaya membuat komponen Bereaksi untuk kasus khusus ini: https://github.com/coreyleelarson/react-typekit
Hanya perlu memasukkan ID Kit Typekit Anda sebagai alat peraga dan Anda siap melakukannya.
sumber
Ada solusi yang sangat bagus menggunakan
Range.createContextualFragment
.Ini berfungsi untuk HTML sewenang-wenang dan juga menyimpan informasi konteks seperti
document.currentScript
.sumber
Anda dapat menggunakan
npm postscribe
untuk memuat skrip di komponen reaksisumber
Anda juga dapat menggunakan helm reaksi
Helm mengambil tag HTML biasa dan menghasilkan tag HTML biasa. Ini sederhana, dan Bereaksi ramah pemula.
sumber
untuk banyak skrip, gunakan ini
sumber
sumber
Anda dapat menemukan jawaban terbaik di tautan berikut:
https://cleverbeagle.com/blog/articles/tutorial-how-to-load-third-party-scripts-dynamically-in-javascript
sumber
Menurut solusi Alex McMillan , saya memiliki adaptasi berikut.
Lingkungan saya sendiri: React 16.8+, v9 + berikutnya
// tambahkan komponen khusus bernama Script
// hooks / Script.js
// Gunakan kompoennt khusus, cukup impor dan gantikan
<script>
tag huruf kecil lama dengan<Script>
tag case unta kustom sudah cukup.// index.js
sumber
Sedikit terlambat ke pesta tetapi saya memutuskan untuk membuat yang saya sendiri setelah melihat jawaban @Alex Macmillan dan itu dengan melewati dua parameter tambahan; posisi di mana menempatkan skrip seperti atau dan mengatur async ke true / false, ini dia:
Cara untuk memanggilnya persis sama dengan yang ditunjukkan pada jawaban yang diterima dari pos ini tetapi dengan dua parameter tambahan (lagi):
sumber
Untuk mengimpor file JS dalam proyek reaksi gunakan commange ini
Sederhana dan mudah.
Dalam kasus saya, saya ingin mengimpor file JS ini dalam proyek reaksi saya.
sumber
Solusi tergantung pada skenario. Seperti dalam kasus saya, saya harus memuat embed kalender di dalam komponen reaksi.
Calendly mencari div dan membaca dari
data-url
atribut itu dan memuat iframe di dalam div tersebut.Semuanya baik ketika Anda pertama kali memuat halaman: pertama, div dengan
data-url
diberikan. Kemudian skrip calendly ditambahkan ke tubuh. Browser mengunduh dan mengevaluasinya dan kami semua pulang dengan senang hati.Masalah muncul ketika Anda menavigasi lalu kembali ke halaman. Kali ini skrip masih dalam tubuh dan browser tidak mengunduh ulang & mengevaluasi ulang itu.
Memperbaiki:
componentWillUnmount
menemukan dan menghapus elemen skrip. Kemudian saat dipasang kembali, ulangi langkah-langkah di atas.$.getScript
. Ini adalah penolong jquery yang bagus yang mengambil skrip URI dan panggilan balik sukses. Setelah skrip dimuat, ia mengevaluasi dan menjalankan panggilan balik sukses Anda. Yang harus saya lakukan adalah dicomponentDidMount
$.getScript(url)
.render
Metode saya sudah memiliki div kalender. Dan itu bekerja dengan lancar.sumber