首页 > 解决方案 > 将 React SVG 组件渲染为 backgroundImage

问题描述

我正在尝试渲染一个返回 a<svg>作为 abackgroundImage的React 组件<div>。目前我正在使用ReactDOMServerwith renderToStaticMarkuporrenderToString但没有显示:

const SvgComponent = () => {
    return (
        <svg xmlns='http://www.w3.org/2000/svg'><rect fill='red' x='0' y='0' /></svg>
    )
}

const ParentComponent = () => {
    return (
        <div
            className={classes.banner}
            style={{
                backgroundImage: `url("data:image/svg+xml;utf8, ${ReactDOMServer.renderToStaticMarkup(<SvgComponent />)} ")`
            }}
        >
        </div>
    )
}

jsx-to-string包会以这种方式实现吗?

标签: reactjssvgjsx

解决方案


您必须使用encodeURIComponent()URI 对 SVG 数据进行编码,因为如果 SVG 数据未经过 URI 编码,React 将不会渲染它。所以,

const svgString = encodeURIComponent(renderToStaticMarkup(<SvgComponent />));

<rect>此外,设置SVG的宽度和高度,例如,

<rect fill="red" width={100} height={100} />

所以最终的代码应该是这样的,

import ReactDOM from "react-dom";
import { renderToStaticMarkup } from "react-dom/server";
import React from "react";

const SvgComponent = () => {
  return (
    <svg xmlns="http://www.w3.org/2000/svg">
      <rect fill="red" width={100} height={100} />
    </svg>
  );
};



const ParentComponent = () => {
const svgString = encodeURIComponent(renderToStaticMarkup(<SvgComponent />));
  return (
      <div
          style={{
              backgroundImage: `url('data:image/svg+xml;utf8, ${svgString}')`,
             width:500,
             height:500
            }}
      >
      </div>
  )
}

ReactDOM.render(<ParentComponent />, document.getElementById("root"));

我在 CodeSandbox 中设置了相同的,

编辑反应示例


推荐阅读