SVG 过滤器无法在 React 中渲染

Posted

技术标签:

【中文标题】SVG 过滤器无法在 React 中渲染【英文标题】:SVG filter can't be rendered in React 【发布时间】:2016-09-07 13:19:28 【问题描述】:

我正在尝试将 SVG 过滤器(在本例中为 <feGaussianBlur>)加载到使用 React(15.0.1) 的 Web 应用程序中的图形元素 <rect>。代码看起来与此类似

在 component1.js 中:

render()
   return(
      <defs>
        <filter id='blur'>
          <feGaussianBlur stdDeviation="5" />
        </filter>
      </defs>
      <component2 />
   );

在component2.js中:

render()
  <rect x="some_xpos" 
        y="some_ypos"
        
        
        filter="url(#blur)" 
  >
  </rect>

所有这些组件都将在同一个 html 页面上呈现,但不知何故,当整个页面呈现时,过滤器并未应用。我研究了不同的选择:

option1 : 将 svg 过滤器导出到公共资产文件夹中自己的 .svg 文件,并使用公共 url 导出 url()。由于 Chrome 错误link 无法正常工作 option2 :将&lt;filter&gt; 放在整个应用程序呈现的主要(也是唯一一个)index.html 文件中。我还把它放在最上面,用自己的&lt;svg&gt; 标签包裹起来。没用。

在我看来,&lt;rect&gt; 无法弄清楚过滤器在哪里。我将不胜感激有关如何调试此或替代加载 svg 过滤器的任何建议。

【问题讨论】:

如果你展示在一些服务上重现错误的测试用例会更好,比如 jsfiddle.net [jsfiddle.net/pmvo81ac] 感谢您的链接,将尝试复制它 我相信它是&lt;component /&gt; 中的小写c。与大写-C &lt;Component /&gt;: jsfiddle.net/pmvo81ac/1 一起工作正常 我在我的应用上试过了,还是不行。不过谢谢你的建议。 我不知道react,但是看了github项目上关于xmlns属性的一些问题,看来你需要dangerouslySetInnerHTML。 github.com/facebook/react/issues/2250 【参考方案1】:

如果要直接在 DOM 中创建 SVG 元素,则必须在 SVG 命名空间中创建它们。从我所见,React 不支持这一点。正如 Kaiddo 在 cmets 中提到的那样,解决方法是将元素创建为原始的 innerHTML。

【讨论】:

【参考方案2】:

最好的解决方法是使用“样式”,如下所示:

<rect x="some_xpos" 
        y="some_ypos"
        
        
        style= filter: 'url(#blur)' 
  >

【讨论】:

以上是关于SVG 过滤器无法在 React 中渲染的主要内容,如果未能解决你的问题,请参考以下文章

React - 按对象属性过滤

在某些情况下,SVG在Safari中过滤模糊

反应、获取 API 和过滤数据

为啥“渲染中的错误:TypeError:无法读取未定义的属性'过滤器'”返回甚至已经可用的数据?

SVG 文件不会在 React Native 上同时渲染

为啥过滤器(阴影)导致我的 SVG 在 Safari 中消失?