Для подмены изображения на странице в GatsbyJS можно использовать компонент StaticImage
.
- Сначала нужно получить значение параметра
bn
из URL. Для этого можно использоватьuseLocation
изreact-router-dom
. Пример:
jsximport { useLocation } from "react-router-dom"
function MyComponent() {
const location = useLocation()
const bn = new URLSearchParams(location.search).get("bn")
return (
// ...
)
}
- Затем, используя полученное значение
bn
, можно подставить нужное изображение в компонентStaticImage
. Пример:
jsximport { StaticImage } from "gatsby-plugin-image"
function MyComponent() {
const location = useLocation()
const bn = new URLSearchParams(location.search).get("bn")
let imageSrc
if (bn === "gagarina") {
imageSrc = "/images/gagarina-banner.jpg"
} else if (bn === "another-banner") {
imageSrc = "/images/another-banner.jpg"
} else {
imageSrc = "/images/default-banner.jpg"
}
return (
<StaticImage src={imageSrc} alt="Banner" />
)
}
- Чтобы изображение не мерцало при загрузке, можно использовать атрибут
loading="eager"
. Пример:
jsximport { StaticImage } from "gatsby-plugin-image"
function MyComponent() {
const location = useLocation()
const bn = new URLSearchParams(location.search).get("bn")
let imageSrc
if (bn === "gagarina") {
imageSrc = "/images/gagarina-banner.jpg"
} else if (bn === "another-banner") {
imageSrc = "/images/another-banner.jpg"
} else {
imageSrc = "/images/default-banner.jpg"
}
return (
<StaticImage src={imageSrc} alt="Banner" loading="eager" />
)
}
Таким образом, при переходе по URL с параметром bn
будет подставлено соответствующее изображение без мерцания.
Если у вас нет react-router-dom
, вы можете использовать useLocation
из пакета @reach/router
, который входит в Gatsby по умолчанию.
Вот пример, как можно использовать useLocation
и StaticImage
для подмены изображения на странице в Gatsby без react-router-dom
:
jsximport React from "react"
import { useLocation } from "@reach/router"
import { StaticImage } from "gatsby-plugin-image"
const MyComponent = () => {
const location = useLocation()
const bn = new URLSearchParams(location.search).get("bn")
let imageSrc
if (bn === "gagarina") {
imageSrc = "/images/gagarina-banner.jpg"
} else if (bn === "another-banner") {
imageSrc = "/images/another-banner.jpg"
} else {
imageSrc = "/images/default-banner.jpg"
}
return (
<StaticImage src={imageSrc} alt="Banner" loading="eager" />
)
}
export default MyComponent
Здесь мы используем useLocation
из @reach/router
для получения текущего URL и параметра bn
. Затем мы подставляем нужное изображение в компонент StaticImage
с помощью условного оператора if/else
. Наконец, мы добавляем атрибут loading="eager"
, чтобы изображение загружалось заранее и не мерцало при загрузке.
Убедитесь, что изображения gagarina-banner.jpg
, another-banner.jpg
и default-banner.jpg
доступны по соответствующим путям в вашем проекте.