Eu tenho um problema relativamente simples de tentar adicionar scripts em linha a um componente React. O que tenho até agora:
'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>
);
}
};
Eu também tentei:
<script src="https://use.typekit.net/foobar.js"></script>
<script>try{Typekit.load({ async: true });}catch(e){}</script>
Nenhuma das abordagens parece executar o script desejado. Acho que é uma coisa simples que estou perdendo. Alguém pode ajudar?
PS: Ignore o foobar, tenho uma identificação real realmente em uso que não me apetecia compartilhar.
javascript
reactjs
ecmascript-6
react-jsx
ArrayKnight
fonte
fonte
DocumentTitle
.Respostas:
Edit: As coisas mudam rapidamente e isso está desatualizado - ver atualização
Deseja buscar e executar o script repetidamente, toda vez que esse componente é renderizado ou apenas uma vez quando esse componente é montado no DOM?
Talvez tente algo como isto:
No entanto, isso só é realmente útil se o script que você deseja carregar não estiver disponível como módulo / pacote. Primeiro, eu sempre:
npm install typekit
)import
o pacote onde eu preciso (import Typekit from 'typekit';
)É provável como você instalou os pacotes
react
e areact-document-title
partir do seu exemplo, e há um pacote Typekit disponível no npm .Atualizar:
Agora que temos ganchos, uma abordagem melhor pode ser a seguinte
useEffect
:O que o torna um ótimo candidato para um gancho personalizado (por exemplo
hooks/useScript.js
:):Que pode ser usado assim:
fonte
try{Typekit.load({ async: true });}catch(e){}
após oappendChild
componentDidMount
função tiver baixado e anexado o script à página, você terá os objetosjQuery
e$
disponíveis globalmente (por exemplo: ativadowindow
).Além das respostas acima, você pode fazer isso:
A div está vinculada
this
e o script é injetado nela.A demonstração pode ser encontrada em codesandbox.io
fonte
this.instance
à ref dentro do seu método de renderização. Eu adicionei um link de demonstração para mostrá-lo a trabalhardocument
,window
. Então, eu prefiro usar o npmglobal
pacoteMinha maneira favorita é usar o React Helmet - é um componente que permite a fácil manipulação da cabeça do documento de uma maneira que você provavelmente já está acostumado.
por exemplo
https://github.com/nfl/react-helmet
fonte
async="true"
à<script>
tag que adicionou jQuery ao código.async=true
e falha sem ele?Se você precisar ter um
<script>
bloqueio no SSR (renderização no servidor), uma abordagem comcomponentDidMount
não funcionará.Você pode usar a
react-safe
biblioteca. O código em React será:fonte
A resposta que Alex Mcmillan forneceu me ajudou mais, mas não funcionou muito para uma tag de script mais complexa.
Ajustei levemente a resposta dele para encontrar uma solução para uma etiqueta longa com várias funções que já estavam configurando "src".
(Para o meu caso de uso, o script precisava viver na cabeça, o que também é refletido aqui):
fonte
document.head.removeChild(script);
em seu código, ou você vai criar um número infinito de tag de script em seu html, desde que o usuário visita essa página de rotaCriei um componente React para este caso específico: https://github.com/coreyleelarson/react-typekit
Só precisa passar seu ID do Kit Typekit como suporte e você estará pronto.
fonte
Existe uma solução muito boa usando
Range.createContextualFragment
.Isso funciona para HTML arbitrário e também retém informações de contexto, como
document.currentScript
.fonte
Você pode usar
npm postscribe
para carregar o script no componente reactfonte
Você também pode usar capacete de reação
O capacete usa tags HTML simples e gera tags HTML simples. É simples, e Reage amigável para iniciantes.
fonte
para vários scripts, use este
fonte
fonte
Você pode encontrar a melhor resposta no seguinte link:
https://cleverbeagle.com/blog/articles/tutorial-how-to-load-third-party-scripts-dynamically-in-javascript
fonte
De acordo com a solução de Alex McMillan , tenho a seguinte adaptação.
Meu próprio ambiente: Reagir 16.8+, próxima v9 +
// adiciona um componente personalizado chamado Script
// hooks / Script.js
// Use o componente personalizado, apenas importe-o e substitua a
<script>
tag antiga em minúscula pela tag custom camel case<Script>
seria suficiente.// index.js
fonte
Um pouco atrasado para a festa, mas decidi criar o meu próprio depois de analisar as respostas de @Alex Macmillan e isso foi passando dois parâmetros extras; a posição na qual colocar os scripts como ou e configurar o assíncrono como verdadeiro / falso, aqui está:
A maneira de chamá-lo é exatamente a mesma mostrada na resposta aceita deste post, mas com dois parâmetros extras (novamente):
fonte
Para importar arquivos JS no projeto react, use este comando
É simples e fácil.
No meu caso, eu gostaria de importar esses arquivos JS no meu projeto de reação.
fonte
A solução depende do cenário. Como no meu caso, eu tive que carregar uma incorporação calendamente dentro de um componente de reação.
Calendamente procura uma div e lê seu
data-url
atributo e carrega um iframe dentro da referida div.Tudo é bom quando você carrega a página: primeiro, div com
data-url
é renderizado. Em seguida, calendamente, o script é adicionado ao corpo. O navegador faz o download e avalia e todos nós vamos para casa felizes.O problema surge quando você sai e volta para a página. Dessa vez, o script ainda está no corpo e o navegador não faz o download e a reavalia.
Consertar:
componentWillUnmount
localizar e remover o elemento de script. Em seguida, monte novamente, repita as etapas acima.$.getScript
. É um auxiliar de jquery bacana que usa um URI de script e um retorno de chamada bem-sucedido. Depois que o script é carregado, ele é avaliado e dispara seu retorno de chamada bem-sucedido. Tudo o que tenho que fazer é no meucomponentDidMount
$.getScript(url)
. Meurender
método já possui a div calendamente. E funciona sem problemas.fonte