【问题标题】:dynamically rendering svgs in gatsby在 gatsby 中动态渲染 svg
【发布时间】:2021-09-30 19:47:12
【问题描述】:

大家好,我有 sime markdown (mdx) 文件,我想使用 svg。我知道在 gatsby 中渲染动态任何东西都可能很棘手.. 使用 gatsby 图像,您经常必须过滤掉正确的结果。但是对于 svgs,我特别想知道如何根据我的 markdown 中的 frontmatter 动态渲染它们。我试着做一个<img src={svgpath} /> 无济于事。现在我的 svgs 在我的配置中使用它作为组件导入:


    "gatsby-transformer-sharp",
    {
      resolve: "gatsby-plugin-react-svg",
      options: {
        rule: {
          include: /assets/ 
        }
      }
    },

我不知道动态导入文件或动态呈现与降价中名称匹配的适当 svg 的方法。以下是我的 markdown 中的 frontmatter 示例:

---
title: Pediatric Dentistry
slug: pediatric-dentistry
svgPath: '../images/assets/dental.svg'
---

我怎样才能在我的模板文件中为每个特定的降价文件动态显示正确的 svg?我可以动态渲染 png、jpg 等,但因为 svgs 具体需要在 gatsby 中使用 transofmrer-sharp 作为组件导入,我正在苦苦挣扎。提前致谢!

【问题讨论】:

    标签: svg gatsby


    【解决方案1】:

    我想到的一件事是创建一种映射,即导入所需组件的key-value 对。比如:

    import Dental from '../images/assets/dental.svg';
    import OtherSvg from '../images/assets/otherSvg.svg';
    import OtherLogo from '../images/assets/otherLogo.svg';
    
    const SVGMapper = {
      'dental': Dental,
      'otherSvg': OtherSvg,
      'otherLogo': OtherLogo,
    };
    
    export default SVGMapper;
    

    等等……

    然后,要从您的降价中呈现它,您只需要:

      let SVGComponent = SVGMapper['dental'];
    
      return <SVGComponent />;
    

    您可以使用循环或任何您想要的方式使其动态化。

    如果需要,您甚至可以更改路径的 keydentalotherSvgotherLogo)。方法完全相同,您需要更改 SVG 路径的 key 并渲染 SVGMapper[svgPath]

    【讨论】:

    • 如果您需要更多详细信息,请随时索取。如果问题最终得到解决,请考虑接受/投票以关闭问题的答案。
    • 还是不行...试一试:/
    • 应该的。输出是什么?你能提供试验吗?
    • 我最终只是做了一堆 if 语句并使用这种方法。总的来说,虽然没有你的方法没有奏效。似乎任何时候我从另一个文件导出 SVG 渲染都不适用于 gatsby。一般来说,gastby 的图像处理有时会变得非常烦人。所有这些愚蠢的特殊用例和陷阱情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2019-01-13
    • 2016-08-04
    相关资源
    最近更新 更多