[解決済み] React/JSXにscriptタグを追加する。
2022-03-22 22:24:38
質問
Reactコンポーネントにインラインスクリプトを追加しようとする、比較的簡単な問題があります。これまで私が持っているもの。
'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>
);
}
};
も試しました。
<script src="https://use.typekit.net/foobar.js"></script>
<script>try{Typekit.load({ async: true });}catch(e){}</script>
どちらの方法でも、目的のスクリプトは実行されないようです。私が見落としているのは、単純なことだと思います。どなたか教えてください。
PS: foobarは無視してください。私は実際に使用している本物のIDを持っていますが、共有する気になれませんでした。
解決するには?
編集:物事は急速に変化しており、これは古いものです - アップデートを参照してください。
このコンポーネントがレンダリングされるたびに何度もスクリプトを取得して実行するのか、それともこのコンポーネントが DOM にマウントされたときに一度だけ実行するのか?
おそらく、次のようなことを試してみてください。
componentDidMount () {
const script = document.createElement("script");
script.src = "https://use.typekit.net/foobar.js";
script.async = true;
document.body.appendChild(script);
}
ただし、この方法が本当に役に立つのは、ロードしたいスクリプトがモジュールやパッケージとして提供されていない場合だけです。 まず、私なら必ず
- でパッケージを探します。 npm
-
パッケージをダウンロードし、私のプロジェクトにインストールします (
npm install typekit
) -
import
必要なパッケージ (import Typekit from 'typekit';
)
このような方法でパッケージをインストールしたと思われます。
react
と
react-document-title
は、あなたの例から、そして、そこには
npmで利用可能なTypekitパッケージ
.
更新情報
フックがある以上、より良い方法は
useEffect
というように
useEffect(() => {
const script = document.createElement('script');
script.src = "https://use.typekit.net/foobar.js";
script.async = true;
document.body.appendChild(script);
return () => {
document.body.removeChild(script);
}
}, []);
そのため、カスタムフック(例.
hooks/useScript.js
):
import { useEffect } from 'react';
const useScript = url => {
useEffect(() => {
const script = document.createElement('script');
script.src = url;
script.async = true;
document.body.appendChild(script);
return () => {
document.body.removeChild(script);
}
}, [url]);
};
export default useScript;
というように使うことができます。
import useScript from 'hooks/useScript';
const MyComponent = props => {
useScript('https://use.typekit.net/foobar.js');
// rest of your component
}
関連
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] HTMLマークアップのどこに<script>タグを記述すればよいですか?
-
[解決済み] React JSX内のループ
-
[解決済み] jQuery get specific option tag text
-
[解決済み] scriptタグの中にCDATAセクションが必要なのはどんな場合ですか?
-
[解決済み] React NativeとReactの違いは何ですか?
-
[解決済み] スクリプトタグ - 非同期と遅延
-
[解決済み] Reactでes6クラスを使うときの「super()」と「super(props)」の違いとは?
-
[解決済み] React JSX: selecting "selected" on selected <select> option
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JSクロスドメインソリューション リアクト構成 リバースプロキシ
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
vue ディレクティブ v-html と v-text
-
[解決済み】リソースの読み込みに失敗した:Bind関数でサーバーが500(Internal Server Error)のステータスで応答した【非公開
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません
-
[解決済み】React Uncaught Error: 対象コンテナが DOM 要素でない [重複]。
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法