使用 GatsbyImage 在悬停时更改图像的最佳方法

Best way to change image on hover using GatsbyImage

我确实希望我的产品图片在鼠标悬停期间发生变化,但由于 GatsbyImage 不支持 onMouseEnter 属性,处理此问题的最佳方法是什么?

产品图片:

<GatsbyImage
              alt={firstImage?.altText ?? title}
              image={firstImage?.gatsbyImageData ?? storefrontImageData}
              loading={eager ? "eager" : "lazy"}
              className="object-cover object-center w-full h-full group-hover:opacity-75"
            />
          </div>

其中 firstImage 是数组中的第一个对象,secondImage 将是图像数组中的第二个 image/object,从 Shopify 中提取,悬停时需要是活动图像。

我正在考虑一种解决方案,使两个 div 中的每一个都有一个独特的图像,并且只需在悬停时使用 Framer Motion 激活和动画第二个 div(使用条件渲染).但就我而言,这不是一种干净的方法。我想遵循最佳实践,但我仍在学习很多东西,所以这就是我寻求帮助的原因:)

您可以只创建一个包装器 div 来监听 onMouseEnter/onMouseLeave 事件:

const [activeImage, setActiveImage]= useState("gatsby");
// ...

  <div onMouseEnter={setActiveImage("store")} onMouseLeave={setActiveImage("gatsby")}>
      {activeImage === "gatsby" ? <GatsbyImage
                  alt={firstImage?.altText ?? title}
                  image={firstImage?.gatsbyImageData}
                  loading={eager ? "eager" : "lazy"}
                  className="object-cover object-center w-full h-full group-hover:opacity-75"
                /> : <GatsbyImage
                  alt={"Second Image"}
                  image={storefrontImageData}
                  loading={eager ? "eager" : "lazy"}
                  className="object-cover object-center w-full h-full group-hover:opacity-75"
                />}
    </div>

你的 setActiveImage 可以是你需要的任何东西,在这种情况下,我设置了一个在 gatsbystore 之间变化的函数来表示目的,但可以是布尔值,等等