将SVG组件作为背景图像处理到div

问题描述 投票:4回答:5

[我正在尝试获取样式组件以采用作为React组件的SVG并将其设置为背景图像,但出现错误:

TypeError:无法将符号值转换为字符串

SVG组件代码:

import React from "react";

const testSVG = props => {
  return (
    <svg version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 193.3 129.7">
      <g>
        <g>
          <g>
            <path
              fill="#434343"
              class="st0"
              d="M162.4,116c-4.6,7.5-15.6,13.6-24.4,13.6H16c-8.8,0-12.3-6.2-7.7-13.7c0,0,4.6-7.7,11.1-18.4
                c4.4-7.4,8.9-14.7,13.3-22.1c1.1-1.8,6.1-7.7,6.1-10.1c0-7.3-15-24.9-18.5-30.7C13.5,23.6,8.3,14.9,8.3,14.9
                C3.7,7.4,7.2,1.2,16,1.2c0,0,65.9,0,106.8,0c10,0,25.9-4.5,33.5,3.8c8.7,9.3,15.5,25.4,22.5,36.8c2.6,4.2,14.5,18.3,14.5,23.8
                c-0.1,7.6-16,26.1-19.6,32C167.1,108.3,162.4,116,162.4,116z"
            />
          </g>
        </g>
      </g>
    </svg>
  );
};

export default testSVG;

容器组件代码:

import React, { Component } from "react";
import StepSVG from "../../components/UI/SVGs/Test";

class StepBar extends Component {
  render() {
    const { steps } = this.props;

    return (
      <div>
        {steps
          ? steps.map(step => {
              return (
                <Wrap key={step._id} bg={StepSVG}>
                  <P>
                    {" "}
                    <Link to={"/step/" + step._id}>{step.title} </Link>
                  </P>
                </Wrap>
              );
            })
          : null}
      </div>
    );
  }
}

export default StepBar;

const Wrap = styled.div`
  padding: 30px 30px 0 0;
  display: inline-block;
  background-image: url(${props => props.bg});
`;

我正在使用开箱即用的create-react-app。

我也尝试过不使用样式化的组件,而使用内联样式却没有成功。

在这种情况下,是否可以将SVG用作背景图像,而SVG是组件?

javascript reactjs svg styled-components
5个回答
4
投票

很遗憾,您要实现的目标是不可能的。您必须将SVG保留为实际的.svg文件(并链接到该文件),或者进行一些CSS欺骗以将SVG组件放置在前台组件的后面。


2
投票

实际上,有一种方法可以实现您想要的目标,而SVG不会成为组件:


1
投票
url(`data:image/svg+xml;utf8,${svgTxt}`)

0
投票

您可能应该将其转换为字符串(如错误所指出)。显然,您不能将React组件用作背景图像,因为react组件实际上是一个javascript对象(JSX转换为JS,然后转换为HTML)。因此,您可以做的/尝试的是使用ReactDOMServer(https://reactjs.org/docs/react-dom-server.html)。


0
投票

对于React SVG背景图像,我发现这最有效:


推荐问答