У меня относительно простая проблема - попытка добавить встроенные сценарии в компонент 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, у меня есть настоящий идентификатор, которым я не хотел делиться.
javascript
reactjs
ecmascript-6
react-jsx
ArrayKnight
источник
источник
DocumentTitle
.Ответы:
Изменить: все меняется быстро, и это устарело - см. Обновление
Вы хотите загружать и выполнять скрипт снова и снова, каждый раз, когда этот компонент отображается, или только один раз, когда этот компонент монтируется в DOM?
Возможно, попробуйте что-то вроде этого:
Однако это действительно полезно, только если скрипт, который вы хотите загрузить, не доступен в виде модуля / пакета. Во-первых, я бы всегда:
npm install typekit
)import
пакет, где мне это нужно (import Typekit from 'typekit';
)Это, вероятно, как вы установили пакеты
react
иreact-document-title
из вашего примера, и есть пакет Typekit, доступный на npm .Обновить:
Теперь, когда у нас есть хуки, лучшим подходом может быть использование
useEffect
так:Что делает его отличным кандидатом на пользовательский хук (например:)
hooks/useScript.js
:Который можно использовать так:
источник
try{Typekit.load({ async: true });}catch(e){}
послеappendChild
componentDidMount
функция скачала и добавила скрипт на страницу, у вас будут доступны объектыjQuery
и$
глобально (т. Е. Включеныwindow
).В дополнение к ответам выше вы можете сделать это:
DIV связан с,
this
и сценарий вводится в него.Демо можно найти на codesandbox.io
источник
this.instance
с ref внутри вашего метода рендера. Я добавил демонстрационную ссылку, чтобы показать, как она работаетdocument
,window
. Поэтому я предпочитаю использоватьglobal
пакет npmМой любимый способ - использовать React Helmet - это компонент, который позволяет легко манипулировать заголовком документа так, как вы, вероятно, уже привыкли.
например
https://github.com/nfl/react-helmet
источник
async="true"
к<script>
тегу , который добавил Jquery к коду.async=true
и не работает без него?Если вам нужно иметь
<script>
блок в SSR (рендеринг на стороне сервера), подход сcomponentDidMount
не будет работать.Вы можете использовать
react-safe
библиотеку вместо. Код в React будет:источник
Ответ, который предоставил Алекс Макмиллан, помог мне больше всего, но не совсем подошел для более сложного тега сценария.
Я слегка подправил его ответ, чтобы найти решение для длинного тега с различными функциями, который дополнительно уже устанавливал «src».
(В моем случае сценарий должен был жить в голове, что также отражено здесь):
источник
document.head.removeChild(script);
в свой код, или вы будете создавать бесконечное количество тегов сценария в вашем HTML, пока пользователь посещает эту страницу маршрутаЯ создал компонент React для этого конкретного случая: https://github.com/coreyleelarson/react-typekit
Просто нужно передать свой ID Kitkit Kit в качестве реквизита, и все готово.
источник
Существует очень хороший способ использования
Range.createContextualFragment
.Это работает для произвольного HTML и также сохраняет контекстную информацию, такую как
document.currentScript
.источник
Вы можете использовать
npm postscribe
для загрузки скрипта в реагирующий компонентисточник
Вы также можете использовать реактивный шлем
Шлем принимает простые HTML-теги и выводит простые HTML-теги. Это очень просто, и React дружелюбен для начинающих.
источник
для нескольких сценариев используйте это
источник
источник
Вы можете найти лучший ответ по следующей ссылке:
https://cleverbeagle.com/blog/articles/tutorial-how-to-load-third-party-scripts-dynamically-in-javascript
источник
Согласно решению Алекса Макмиллана , у меня есть следующая адаптация.
Моя собственная среда: Реакция 16.8+, следующая v9 +
// добавляем пользовательский компонент с именем Script
// hooks / Script.js
// Использовать пользовательский compoennt, просто импортировать его и заменить старый
<script>
тег нижнего регистра пользовательским тегом верблюда<Script>
.// index.js
источник
Немного опоздал на вечеринку, но я решил создать свой собственный, посмотрев на ответы @Alex Macmillan, и это было путем передачи двух дополнительных параметров; положение, в котором нужно разместить сценарии, такие как или, и установить асинхронное значение true / false, вот оно:
Способ его вызова точно такой же, как показано в принятом ответе на этот пост, но с двумя дополнительными (опять же) параметрами:
источник
Для импорта файлов JS в реагирующий проект используйте это поле
Это просто и легко.
В моем случае я хотел бы импортировать эти файлы JS в свой проект реагирования.
источник
Решение зависит от сценария. Как и в моем случае, мне пришлось загружать календарный код внутри компонента реакции.
Calendly ищет div, читает его
data-url
атрибут и загружает iframe внутри указанного div.Все хорошо, когда вы впервые загружаете страницу: сначала
data-url
отображается div с . Затем календарный скрипт добавляется в тело. Браузер загружает и оценивает его, и мы все счастливы.Проблема возникает, когда вы уходите, а затем возвращаетесь на страницу. На этот раз скрипт все еще находится в теле, и браузер не перезагружает и не переоценивает его.
Fix:
componentWillUnmount
поиск и удаление элемента сценария. Затем при повторной установке повторите вышеуказанные шаги.$.getScript
. Это отличный jquery помощник, который принимает URI сценария и обратный вызов. Как только скрипт загружен, он оценивает его и запускает ваш успешный обратный вызов. Все, что мне нужно сделать, это в моемcomponentDidMount
$.getScript(url)
. Мойrender
метод уже имеет календарный div. И это работает гладко.источник