在React JS中渲染SVGSVGElement而不使用dangerouslySetInnerHtml

时间:2017-08-25 08:13:40

标签: javascript reactjs svg vis.js

问题: 我可以在不使用SVGSVGElement的情况下在React中呈现dangerouslySetInnerHtml吗?

上下文

我正在使用vis.js图表库,getLegend方法返回SVGSVGElement对象,即 const icon = chart.getLegend(args); 在控制台中我可以看到:

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>

问题:

当我尝试使用以下方式渲染时:

render (
<div> { icon } </div>
)

我收到以下错误:

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`

解决方法:

目前我正在使用: <svg dangerouslySetInnerHTML={{__html: icon.innerHTML}} />

但是我希望有一个直截了当的解决方案,它不会在名称中使用带有危险一词的方法。

研究

我读过这个类似的问题,但我认为它对运行时生成的SVG没有帮助:How do I use an SVG in React without using dangerouslySetInnerHTML?

1 个答案:

答案 0 :(得分:3)

您可以像这样简单地使用useRef附加SVGSVGElement。此示例适用于具有挂钩的功能组件,但可以适用于类组件。

const svg = useRef(null);
useEffect(()=>{
    if(svg.current){
        svg.current.appendChild(icon)
    } 
}, []);

return (
    <div ref={svg}/>
);