Question:
Can I render an SVGSVGElement
in React without using dangerouslySetInnerHtml
?
Context:
I am using the vis.js graph library, the getLegend
method returns an SVGSVGElement
object i.e.
const icon = chart.getLegend(args);
In the console I can see this:
in: icon instanceof SVGSVGElement
out: true
in: icon
out: <svg><rect x="0" y="0" width="30" height="30" class="vis-outline"></rect><path class="vis-graph-group0" d="M0,15 L30,15"></path></svg>
Problem:
When I try to render this in react using:
render (
<div> { icon } </div>
)
I get the following error:
Error: Objects are not valid as a React child (found: [object SVGSVGElement]). If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons. Check the render method of `LegendElement`
Workaround:
For now I am using:
<svg dangerouslySetInnerHTML={{__html: icon.innerHTML}} />
But I was hoping for a straightforward solution that doesn't use a method with the word dangerous in the name.
Research:
I read this similar question but I don't think it helps for SVG generated at run time: How do I use an SVG in React without using dangerouslySetInnerHTML?
TL;DR you can (and should) create React components that render nothing and use them to manage data and state in your app, in order to have components that are reusable and composable for real.
Using React without JSX is especially convenient when you don't want to set up compilation in your build environment. Each JSX element is just syntactic sugar for calling React. createElement(component, props, ...children) . So, anything you can do with JSX can also be done with just plain JavaScript.
The ReactDOM.render() function takes two arguments, HTML code and an HTML element. The purpose of the function is to display the specified HTML code inside the specified HTML element.
Using an SVG as a componentimport React from 'react'; import {ReactComponent as ReactLogo} from './logo. svg'; const App = () => { return ( <div className="App"> <ReactLogo /> </div> ); } export default App; Note that this approach only works with Create React App.
You can simple append the SVGSVGElement using a useRef like this. This example is for a functional component with hooks but can be adapted for class components.
const svg = useRef(null);
useEffect(()=>{
if(svg.current){
svg.current.appendChild(icon)
}
}, []);
return (
<div ref={svg}/>
);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With