I have a question about Gatsby, specifically about how to import images if I'm using a JS object because I'm passing it through a prop (look at code-column n°1, literal object in N°2) in the 3rd column is the whole component with all the object being called.
In Gatsby's documentation say that we need to import the img or SVG on top of the component but in this case, I can't.
Also, I have tried adding a src={require(img)}
in the component but still not working, even when I use an auto-complete path Visual Studio Code extension:
Thanks in advance!
Code:
Column One heroSection.js. I pass a image through a prop because I need to use the component a lot of times, just can't put only one image without props:
import React from 'react';
import { Spring } from 'react-spring/renderprops';
import './heroSection.css';
import { Button } from './button';
import { Link } from 'gatsby';
export default function HeroSection({
lightBg,
topLine,
lightText,
lightTextDesc,
headline,
description,
buttonLabel,
img,
alt,
imgStart
}) {
return (
<>
{/* Background Color */}
<div className={lightBg ? 'home__hero-section' : 'home__hero-section darkBg'}>
{/* Container: Row & Column */}
<div className='container'>
<div className='row home__hero-row'
style={{
display: 'flex',
flexDirection: imgStart === 'start' ? 'row-reverse' : 'row'
}}
>
{/* Column */}
<div className='col'>
{/* Toplin & Header */}
<div className='home__hero-text-wrapper'>
<Spring from={{ opacity:0 }} to={{ opacity:1 }} config={{ delay: 900, duration: 1100 }} >
{props => (
<div style={props}>
<div className='top-line'>{topLine}</div>
<h1 className={lightText ? 'heading' : 'heading dark'}>
{headline}
</h1>
{/* Description */}
<p className={ lightTextDesc ? 'home__hero-subtitle' : 'home__hero-subtitle dark' }>
{description}
</p>
{/* Button */}
<Link to='/sign-up'>
<Button buttonStyle='btn--ghost' buttonColor='scarlet' buttonSize='btn--wide' >
{buttonLabel}
</Button>
</Link>
</div>
)}
</Spring>
</div>
</div>
{/* Image */}
<div className='col'>
<div className='home__hero-img-wrapper'>
<img src={img} alt={alt} className='home__hero-img' loading="lazy"/>
</div>
</div>
</div>
</div>
</div>
</>
);
}
Column 2 indexData.js JS objects with the data I will pass on to the properties of component (column 1).
export const tecnologia = {
lightBg: false,
lightText: true,
lightTextDesc: true,
topLine: 'Tecnología y Ambiente',
headline: 'Horticultura urbana tecnológica para todos',
description:
'Nuestro sofware te acesora, supervisa y mejora tus cultivos urbanos además de ser altamente soportada por la comunidad por su código abierto.',
buttonLabel: '¡Empieza Ahora!',
imgStart: 'start',
img: '/src/images/environment.svg',
alt: 'Environment'
};
export const comunidad = {
lightBg: true,
lightText: false,
lightTextDesc: false,
topLine: 'Amado por la comunidad',
headline: 'El software es atendido por la comunidad',
description:
"Sin importar el tipo de cultivo, la comunidad aporta semanalmente grandes cambios y variaciones d nustro software modular para hacer más amplio la cartera de plantas que el usuario podrá cultivar sin procuparse.",
buttonLabel: 'Abrir Repositorio',
imgStart: '',
img: '../images/programmer.svg',
alt: 'Programmer'
};
export const seguridad = {
lightBg: false,
lightText: true,
lightTextDesc: true,
topLine: '100% Seguro',
headline: 'Protegemos tus datos',
description:
'¡Confía en nosotros! No vendemos tus datos sensibles a terceros, la seguridad y confianza es menester para nuestro producto',
buttonLabel: 'Leer Políticas',
imgStart: 'start',
img: '../images/sec.svg',
alt: 'Seguridad'
};
export const estadistica = {
lightBg: false,
lightText: true,
lightTextDesc: true,
topLine: 'Ciencia De Datos',
headline: 'Ofrecemos estadísticas de tus cosechas para mejorarlas',
description:
'Analizamos los datos para ofrecer un mejor servicio y los abrimos anónimamente a la comunidad, para así enfocarnos en una mejor experiencia de usuario, cosechas más fértiles y ahorro de tiempo.',
buttonLabel: 'Registrate Ahora',
imgStart: '',
img: '../images/data.svg',
alt: 'Data'
};
Column 3 index.js, also knows as a Home or IndexPage. Here is the component being used many times.
import React from "react";
import './index.css';
import Layout from './../components/layout';
import HeroSection from './../components/heroSection';
import { tecnologia, comunidad, seguridad, estadistica } from './indexData.js';
export default function IndexPage() {
return (
<Layout>
<HeroSection {...tecnologia} />
<HeroSection {...comunidad} />
<HeroSection {...seguridad} />
<HeroSection {...estadistica} />
</Layout>
)
}