javascript - 硬编码英雄幻灯片到 gatsby-image-plugin
问题描述
我的“主页英雄幻灯片”是我网站的最后一个硬编码部分。我想让它变得动态并使用 gatsby-image-plugin 的魔力。
“硬编码”代码:
HeroSlider.js
import React, { useState } from 'react'
import { useInterval } from './useInterval'
import Hero1 from '../../images/hero1.webp'
import Hero2 from '../../images/hero2.webp'
import Hero3 from '../../images/hero4.webp'
const HeroSlider = () => {
const slides = [
{
id: '01',
image: Hero1
},
{
id: '02',
image: Hero2
},
{
id: '03',
image: Hero3
}
]
const [state, setState] = useState({
slides,
activeIndex: 0,
autoSlide: true,
interval: 3000
})
// By Dan Abramov overreacted.io
useInterval(
() => {
setState(prev => ({
...prev,
activeIndex: (prev.activeIndex + 1) % prev.slides.length
}))
},
state.autoSlide ? state.interval : null
)
return (
<SliderWrapper>
{slides.map((slide, i) => (
<Slide key={slide.id} slide={slide} active={state.activeIndex === i} />
))}
</SliderWrapper>
)
}
export default HeroSlider
HeroSlider.styles.js
import styled from 'styled-components'
export const StyledImg = styled.div`
background: ${props =>
`linear-gradient(
to bottom, rgba(32, 33, 35, .8)
39%,rgba(32, 33, 35, .8)
41%,rgba(32, 33, 35, .8)
100%
),
url('${props.image}'), var(--darkGrey)`};
幻灯片.js
import React from 'react'
import { StyledImg, WbnSlide } from './HeroSlider.styles'
const Slide = ({ slide, active }) => (
<WbnSlide className={active ? 'active' : ''}>
<StyledImg image={slide.image} />
<div className="wbn-overlay-text">
<h1 className="wbn-header">Desenvolvimento Front End</h1>
<p className="wbn-text">
A mágica do React em suas aplicações com performance e design incríveis,
para voce alcançar seus objetivos de negócio.
<button type="button" className="sldie-button">
<span>COMECE AGORA</span> entre em contato
</button>
</p>
</div>
</WbnSlide>
)
export default Slide
我正在查询为将图像添加到幻灯片而创建的 ACF:
query HomeSlidesQuery {
wpPage(databaseId: {eq: 13}) {
id
ACF_HomePage {
slideimages {
slide {
localFile {
childImageSharp {
gatsbyImageData(formats: WEBP, layout: FULL_WIDTH, placeholder: BLURRED)
}
}
}
}
}
}
}
返回一个数组:
{
"data": {
"wpPage": {
"id": "cG9zdDoxMw==",
"ACF_HomePage": {
"slideimages": [
{
"slide": {
"localFile": {
"childImageSharp": {
"gatsbyImageData": {
"layout": "fullWidth",
"placeholder": {
"fallback":
我不知道如何使用这些数据来替换我的硬编码数组和样式组件“StyledImg”中的道具。我尝试了几种方法,但没有奏效。
解决方案
这应该有效:
import React, { useState } from 'react'
import { useInterval } from './useInterval'
import Hero1 from '../../images/hero1.webp'
import Hero2 from '../../images/hero2.webp'
import Hero3 from '../../images/hero4.webp'
const HeroSlider = ({data}) => {
const [state, setState] = useState({
data.wpPage.ACF_HomePage.slideimages,
activeIndex: 0,
autoSlide: true,
interval: 3000
})
// By Dan Abramov overreacted.io
useInterval(
() => {
setState(prev => ({
...prev,
activeIndex: (prev.activeIndex + 1) % prev.slides.length
}))
},
state.autoSlide ? state.interval : null
)
return (
<SliderWrapper>
{data.wpPage.ACF_HomePage.slideimages.map({slide}, i) => (
<Slide key={i} slide={slide} active={state.activeIndex === i} />
))}
</SliderWrapper>
)
}
query HomeSlidesQuery {
wpPage(databaseId: {eq: 13}) {
id
ACF_HomePage {
slideimages {
slide {
localFile {
childImageSharp {
gatsbyImageData(formats: WEBP, layout: FULL_WIDTH, placeholder: BLURRED)
}
}
}
}
}
}
}
export default HeroSlider
然后,按照您要查询的结构:
import React from 'react'
import { StyledImg, WbnSlide } from './HeroSlider.styles'
const Slide = ({ slide, active }) => {
console.log("slide data", slide);
return <WbnSlide className={active ? 'active' : ''}>
<StyledImg image={slide.localFile.childImageSharp.gatsbyImageData} />
<div className="wbn-overlay-text">
<h1 className="wbn-header">Desenvolvimento Front End</h1>
<p className="wbn-text">
A mágica do React em suas aplicações com performance e design incríveis,
para voce alcançar seus objetivos de negócio.
<button type="button" className="sldie-button">
<span>COMECE AGORA</span> entre em contato
</button>
</p>
</div>
</WbnSlide>
}
export default Slide
假设您的查询检索到正确的数据,您只需要遍历幻灯片 ( slideimages
)。我解构了嵌套slide
,但想法是一样的。然后你只需要知道你的 styled-component 通过 props 接收到的每个slide
组件Slide
(我放置 a 的地方console.log()
)。
检查useInterval
钩子以确保正确设置状态,因为您的数据结构可能已更改。另请注意,您没有id
now,您可能希望以某种方式将其包含在您的 WordPress 中,目前,我使用 index ( i
) 作为key
each slide
。
推荐阅读
- pyomo - 使用约束更新参数
- python - 如何将longlat点的pandas数据帧中的ID与第二个数据帧相关联?
- java - 选择不变时触发 Spinner 事件
- spring-boot - 如果配置服务器关闭,推荐/替代启动 Spring Boot 应用程序的方法?
- javascript - 如何获得随机密钥
- c# - C#中字符串的最短子串
- javascript - 以 DD-MM-YY-23:59:42 格式获取 NodeJS 中的当前时间戳
- ansible - 尝试将 ansible 与检查点管理服务器集成时出错
- bash - 如何仅使用 Intel 的 Pin 检测 SPEC CPU2006 的实际基准测试?
- crash - ReactNative 应用程序崩溃致命异常:OkHttp Dispatcher