【问题标题】:gatsby-plugin-image Load image with the given propgatsby-plugin-image 使用给定的道具加载图像
【发布时间】:2021-08-09 08:04:57
【问题描述】:

考虑我有以下组件

// variant can be one of [facebook, google, apple, ...etc]
<CompanyLogo variant="facebook"/>

variant 的可能值的数量是有限的。

我想根据variant prop的值动态加载对应的图片。

现在,我想到了两种方法。

方案一:使用 GraphQL 查询所有公司 logo 图片并使用 JS 找到我需要的。

const { images: { edges: images } } = useStaticQuery(graphql`
    query {
      images: allFile(filter: {
        sourceInstanceName: {eq: "images"}, 
        relativeDirectory: {eq: "companies"}
      }) {
        edges {
          node {
            name
            childImageSharp {
              gatsbyImageData
            }
          }
        }
      }
    }
  `);

const image = images.find(({ node: { name } }) => variant === name );

我担心的是我不确定这是否会极大地影响性能,尤其是在有很多公司徽标的情况下。

选项2:使用switchif条件加载图片

switch (variant) {
  case 'facebook':
    return <StaticImage src="facebook.png" />
  case 'apple':
    return <StaticImage src="apple.png" />
  // ...etc
}

问题是代码真的很臭。

您有更好的方法来实现这一目标吗?

【问题讨论】:

    标签: reactjs gatsby gatsby-image gatsby-plugin


    【解决方案1】:

    在这两种方法中,选项 1 是最适合您的方法。

    请记住,在切换/案例方法中,您将评估所有案例,直到您的选项匹配,就像您有一堆 ifs 一样。选项 2 是性能最低的方法。

    我会添加第三个试用版,我认为它是性能最好的字典(地图):

    const LOGO_VARIANTS = {
     facebook: <StaticImage src="facebook.png" />,
     apple: <StaticImage src="apple.png" />,
     potatoes: <StaticImage src="potatoes.png" />,
     'dashed-logo':  <StaticImage src="dashed-logo.png" />
    }
    

    然后,您只需要使用如下键值访问位置:

    const SomeComponent = () =>{
    
       return <div>My logo is {LOGO_VARIANTS['facebook']}</div>
    }
    

    注意:调整该逻辑以使其适应您的需求,例如将 LOGO_VARIANTS['facebook'] 分配给新变量并将其呈现为:const Image= LOGO_VARIANTS['facebook'],然后是 &lt;Image/&gt;

    我不确定整个逻辑,这种方法可能不是您的最佳/最佳解决方案。如果您不想过度使用逻辑,我会使用选项 1,它比选项 2 好得多。

    【讨论】:

    • 一次查询所有图片会影响性能和内存使用吗?我不确定 Gatsby 如何处理 GraphQL 查询,它们是在运行时执行还是在构建时执行?
    • 啊,那性能影响毕竟没那么大。
    • 不,在这一点上,这不是性能问题(即使是具有 3 个选项的 switch/case 也没有任何意义的影响,而不是其他选项),而是可读性。对于一个小型项目,您不会注意到任何方法之间的任何区别。但在大型项目中,构建过程可能会因为这种技术决策而延迟
    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2021-12-10
    • 2022-01-15
    • 1970-01-01
    • 2021-07-17
    • 2020-07-13
    • 2021-10-17
    • 2021-12-31
    相关资源
    最近更新 更多