Итак, у меня есть массив изображений, каждое из которых имеет интерактивный оверлей, и у меня есть модальное окно, которое меняет цвет фона в зависимости от имени оверлея, который я нажимаю, который я хочу передать как опору, но это невозможно из-за того, что изображения генерируются с помощью функции, а модальное окно находится за пределами функции, поэтому я не могу дать ему необходимое значение, вот мои коды ниже:
Это мои JSON локальные данные:
{
"portfolio": [
{
"id": 1,
"mid":1,
"title": "react",
"image": "/images/portfolio-2/React.jpg"
},
{
"id": 2,
"mid":2,
"title": "angular",
"image": "/images/portfolio-2/Angular.jpg"
},
{
"id": 3,
"mid":3,
"title": "flutter",
"image": "/images/portfolio-2/Flutter.jpg"
},
{
"id": 4,
"mid":4,
"title": "bootstrap",
"image": "/images/portfolio-2/Bootstrap.png"
},
{
"id": 5,
"mid":5,
"title": "unity",
"image": "/images/portfolio-2/Unity.jpg"
},
{
"id": 6,
"title": "photoshop",
"image": "/images/portfolio-2/Photoshop.png"
},
{
"id": 7,
"title": "ionic",
"image": "/images/portfolio-2/Ionic.png"
},
{
"id": 8,
"title": "wordpress",
"image": "/images/portfolio-2/Wordpress.jpg"
}
]
}
Это мой ReactJS Код:
import React, { useState, useEffect } from "react";
import axios from "axios";
import {
PortfolioS,
PortfolioTitle,
Span,
Box,
ImageWrapper,
Image,
Overlay,
OverlaySpan,
} from "./PortfolioStyle.jsx";
import { ProjectModal } from "./ModalStyle.jsx";
export default function Portfolio(props) {
const [images, setImages] = useState([]);
const [open, setOpen] = useState(false);
useEffect(() => {
axios.get("Data/Data.json").then((res) => {
setImages(res.data.portfolio);
});
}, []);
const PortfolioImages = images.map((imageItem) => {
return (
<React.Fragment>
<ImageWrapper key={imageItem.id}>
<Image src={imageItem.image} alt="" />
<Overlay name={imageItem.title}>
<OverlaySpan
name={imageItem.title}
onClick={() => {
setOpen(!open);
test = imageItem.title;
}}
>
View Projects
</OverlaySpan>
</Overlay>
</ImageWrapper>
</React.Fragment>
);
});
return (
<PortfolioS id={"portfolioSection"}>
<div className="container">
<PortfolioTitle>
<Span>My</Span> Portfolio
</PortfolioTitle>
<Box>{PortfolioImages}</Box>
<ProjectModal
isOpen={open}
onRequestClose={props.clearSelectedOption}
ariaHideApp={false}
>
<h2>Modal Title</h2>
<p> Just a test</p>
<button
onClick={() => {
setOpen(!open);
}}
>
Close test
</button>
</ProjectModal>
</div>
</PortfolioS>
);
}
Мой первый файл внешнего стилизованного компонента Ниже:
import styled from "styled-components";
export const PortfolioS = styled.div`
margin-top: 150px;
padding-top: 100px;
background: #f8f8f8;
margin-top: 300px;
overflow: hidden;
@media (max-width: 575px) {
display: block;
margin: auto;
}
`;
export const PortfolioTitle = styled.h1`
text-align: center;
font-size: 35px;
color: #1761a0;
`;
export const Span = styled.span`
font-weight: normal;
color: #eb5424;
`;
export const Box = styled.div`
@media (max-width: 575px) {
width: 100%;
}
`;
export const ImageWrapper = styled.div`
width: 25%;
float: left;
font-size: 0;
position: relative;
&:hover > div {
opacity: 1;
}
`;
export const Image = styled.img`
width: 100%;
@media (min-width: 576px) and (max-width: 768px) {
width: 50%;
}
`;
export const Overlay = styled.div`
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
font-size: 15px;
opacity: 0;
${(props) => {
if (props.name === "react") {
return `
background: rgba(0, 145, 255, 0.5);
`;
} else if (props.name === "angular") {
return `
background: rgba(255, 0, 0, 0.5);
`;
} else if (props.name === "flutter") {
return `
background: rgba(255, 255, 255, 0.5);
`;
} else if (props.name === "bootstrap") {
return `
background: rgba(115, 0, 255, 0.5);
`;
} else if (props.name === "unity") {
return `
background: rgba(255, 255, 255, 0.5);
`;
} else if (props.name === "photoshop") {
return `
background: rgba(88, 150, 255, 0.5);
`;
} else if (props.name === "ionic") {
return `
background: rgba(255, 255, 255, 0.5);
`;
} else {
return `
background: rgba(255, 255, 255, 0.5);
`;
}
}}
`;
export const OverlaySpan = styled.span`
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: block;
padding: 10px 20px;
cursor: pointer;
border: 2px solid white;
${(props) => {
if (props.name === "react") {
return `
background: #33ccff;
`;
} else if (props.name === "angular") {
return `
background: #ff0000;
`;
} else if (props.name === "flutter") {
return `
background: #0099ff;
`;
} else if (props.name === "bootstrap") {
return `
background: #9900cc;
`;
} else if (props.name === "unity") {
return `
background: black;
`;
} else if (props.name === "photoshop") {
return `
background: #3399ff;
`;
} else if (props.name === "ionic") {
return `
background: #1a8cff;
`;
} else {
return `
background: #0099cc;
`;
}
}}
`;
Второй внешний файл стилизованного компонента:
import styled from "styled-components";
import Modal from "react-modal";
export const ProjectModal = styled(Modal)`
margin: auto;
margin-top: 200px;
width: 250px;
height: 300px;
${(props) => {
if (props.names === "react") {
return `
background: #33ccff;
`;
} else if (props.names === "angular") {
return `
background: #ff0000;
`;
} else if (props.names === "flutter") {
return `
background: #0099ff;
`;
} else if (props.names === "bootstrap") {
return `
background: #9900cc;
`;
} else if (props.names === "unity") {
return `
background: black;
`;
} else if (props.names === "photoshop") {
return `
background: #3399ff;
`;
} else if (props.names === "ionic") {
return `
background: #1a8cff;
`;
} else {
return `
background: #0099cc;
`;
}
}}
`;