patternjavascriptreactCritical
Adding script tag to React/JSX
Viewed 0 times
jsxtagreactscriptadding
Problem
I have a relatively straightforward issue of trying to add inline scripting to a React component. What I have so far:
I have also tried:
Neither approach seems to execute the desired script. I'm guessing it's a simple thing I'm missing. Can anybody help out?
PS: Ignore the foobar, I have a real id actually in use that I didn't feel like sharing.
'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 (
People
);
}
};I have also tried:
try{Typekit.load({ async: true });}catch(e){}
Neither approach seems to execute the desired script. I'm guessing it's a simple thing I'm missing. Can anybody help out?
PS: Ignore the foobar, I have a real id actually in use that I didn't feel like sharing.
Solution
Edit: Things change fast and this is outdated - see update
Do you want to fetch and execute the script again and again, every time this component is rendered, or just once when this component is mounted into the DOM?
Perhaps try something like this:
However, this is only really helpful if the script you want to load isn't available as a module/package. First, I would always:
This is likely how you installed the packages
Update:
Now that we have hooks, a better approach might be to use
Which makes it a great candidate for a custom hook (eg:
Which can be used like so:
Do you want to fetch and execute the script again and again, every time this component is rendered, or just once when this component is mounted into the DOM?
Perhaps try something like this:
componentDidMount () {
const script = document.createElement("script");
script.src = "https://use.typekit.net/foobar.js";
script.async = true;
document.body.appendChild(script);
}However, this is only really helpful if the script you want to load isn't available as a module/package. First, I would always:
- Look for the package on npm
- Download and install the package in my project (
npm install typekit)
importthe package where I need it (import Typekit from 'typekit';)
This is likely how you installed the packages
react and react-document-title from your example, and there is a Typekit package available on npm.Update:
Now that we have hooks, a better approach might be to use
useEffect like so: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);
}
}, []);Which makes it a great candidate for a custom hook (eg:
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;Which can be used like so:
import useScript from 'hooks/useScript';
const MyComponent = props => {
useScript('https://use.typekit.net/foobar.js');
// rest of your component
}Code Snippets
componentDidMount () {
const script = document.createElement("script");
script.src = "https://use.typekit.net/foobar.js";
script.async = true;
document.body.appendChild(script);
}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);
}
}, []);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
}Context
Stack Overflow Q#34424845, score: 836
Revisions (0)
No revisions yet.