React App,努力创建一个独立的 handleToggle
React App, struggling to create an independent handleToggle
当我点击打开图片,激活一个新的 class 时,它起作用了,在所有显示最后一张细节的图片上创建“活动”。
我正在努力寻找一种隔离方法,当单击图像时,只有该图像会详细显示。
正在按照代码和link检查问题的结果。
Container.js
import React, { useState } from "react";
import "./Container.css";
import img1 from "./img/img1.jpg";
import img2 from "./img/img2.jpg";
import img3 from "./img/img3.jpg";
import img4 from "./img/img4.jpg";
function Container() {
const [isActive, setActive] = useState("false");
const handleToggle = () => {
setActive(!isActive);
};
return (
<div className="container">
<div className="box">
<div className={`imgBx ${isActive ? "" : "active"}`}>
<img src={img1} alt="img1" onClick={handleToggle} />
</div>
</div>
<div className="box">
<div className={`imgBx ${isActive ? "" : "active"}`}>
<img src={img2} alt="img2" onClick={handleToggle} />
</div>
</div>
<div className="box">
<div className={`imgBx ${isActive ? "" : "active"}`}>
<img src={img3} alt="img3" onClick={handleToggle} />
</div>
</div>
<div className="box">
<div className={`imgBx ${isActive ? "" : "active"}`}>
<img src={img4} alt="img4" onClick={handleToggle} />
</div>
</div>
</div>
);
}
export default Container;
Container.css
.container {
position: absolute;
display: flex;
height: calc(100% - 200px);
width: calc(100% - 200px);
z-index: 100;
}
.container .box {
position: relative;
width: 25%;
height: 100%;
overflow: hidden;
border-right: 10px solid #111;
}
.container .box:last-child {
border-right: none;
}
.container .box .imgBx {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transition: 0.5s;
opacity: 0.5;
filter: grayscale(1);
cursor: pointer;
}
.box .imgBx.active {
position: fixed;
top: 100px;
left: 100px;
height: calc(100% - 200px);
width: calc(100% - 200px);
z-index: 1000;
opacity: 1;
filter: grayscale(0);
}
.container .box .imgBx:hover {
opacity: 1;
filter: grayscale(0);
}
.container .box .imgBx img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
App.js
import Header from "./components/Header";
import Container from "./components/Container";
import Footer from "./components/Footer";
function App() {
return (
<section>
<Header></Header>
<Container></Container>
<Footer></Footer>
</section>
);
}
export default App;
我认为错误在下面这一行
const [isActive, setActive] = useState("false"); // false is a string
应该
const [isActive, setActive] = useState(false); //boolean
所以当你
className={`imgBx ${isActive ? "" : "active"}`}
// it's finding isActive true, always as
// string is always true
如果你想设计你的项目,使每个 div 都有自己的活动状态,你应该,
//data.js
const data = [
{
image: './img/img1.jpg',
status: false
},
{
image: './img/img2.jpg',
status: false
}, {
image: './img/img3.jpg',
status: false
}, {
image: './img/img4.jpg',
status: false
},
]
export defaut data;
然后在你的项目中
import data from './data.js'
function Container() {
const [dataProj, setdata] = useState(data);
return (
<div className="container">
{
dataProj.map((item,index)=>(
<div className="box" key={index+1}>
<div className={`imgBx ${item.status? "" : "active"}`}>
<img src={item.image} alt=`img${index+1}` onClick={()=>{
let itemData = [...dataProj];
let updatedItem = {...itemData[index],status:!item.status};
itemData[index] = updatedItem;
setdata(itemData);
} />
</div>
</div>
))
}
</div>
);
}
export default Container;
这样您就可以为每张图片设置状态。希望有用,谢谢
当我点击打开图片,激活一个新的 class 时,它起作用了,在所有显示最后一张细节的图片上创建“活动”。 我正在努力寻找一种隔离方法,当单击图像时,只有该图像会详细显示。 正在按照代码和link检查问题的结果。
Container.js
import React, { useState } from "react";
import "./Container.css";
import img1 from "./img/img1.jpg";
import img2 from "./img/img2.jpg";
import img3 from "./img/img3.jpg";
import img4 from "./img/img4.jpg";
function Container() {
const [isActive, setActive] = useState("false");
const handleToggle = () => {
setActive(!isActive);
};
return (
<div className="container">
<div className="box">
<div className={`imgBx ${isActive ? "" : "active"}`}>
<img src={img1} alt="img1" onClick={handleToggle} />
</div>
</div>
<div className="box">
<div className={`imgBx ${isActive ? "" : "active"}`}>
<img src={img2} alt="img2" onClick={handleToggle} />
</div>
</div>
<div className="box">
<div className={`imgBx ${isActive ? "" : "active"}`}>
<img src={img3} alt="img3" onClick={handleToggle} />
</div>
</div>
<div className="box">
<div className={`imgBx ${isActive ? "" : "active"}`}>
<img src={img4} alt="img4" onClick={handleToggle} />
</div>
</div>
</div>
);
}
export default Container;
Container.css
.container {
position: absolute;
display: flex;
height: calc(100% - 200px);
width: calc(100% - 200px);
z-index: 100;
}
.container .box {
position: relative;
width: 25%;
height: 100%;
overflow: hidden;
border-right: 10px solid #111;
}
.container .box:last-child {
border-right: none;
}
.container .box .imgBx {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transition: 0.5s;
opacity: 0.5;
filter: grayscale(1);
cursor: pointer;
}
.box .imgBx.active {
position: fixed;
top: 100px;
left: 100px;
height: calc(100% - 200px);
width: calc(100% - 200px);
z-index: 1000;
opacity: 1;
filter: grayscale(0);
}
.container .box .imgBx:hover {
opacity: 1;
filter: grayscale(0);
}
.container .box .imgBx img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
App.js
import Header from "./components/Header";
import Container from "./components/Container";
import Footer from "./components/Footer";
function App() {
return (
<section>
<Header></Header>
<Container></Container>
<Footer></Footer>
</section>
);
}
export default App;
我认为错误在下面这一行
const [isActive, setActive] = useState("false"); // false is a string
应该
const [isActive, setActive] = useState(false); //boolean
所以当你
className={`imgBx ${isActive ? "" : "active"}`}
// it's finding isActive true, always as
// string is always true
如果你想设计你的项目,使每个 div 都有自己的活动状态,你应该,
//data.js
const data = [
{
image: './img/img1.jpg',
status: false
},
{
image: './img/img2.jpg',
status: false
}, {
image: './img/img3.jpg',
status: false
}, {
image: './img/img4.jpg',
status: false
},
]
export defaut data;
然后在你的项目中
import data from './data.js'
function Container() {
const [dataProj, setdata] = useState(data);
return (
<div className="container">
{
dataProj.map((item,index)=>(
<div className="box" key={index+1}>
<div className={`imgBx ${item.status? "" : "active"}`}>
<img src={item.image} alt=`img${index+1}` onClick={()=>{
let itemData = [...dataProj];
let updatedItem = {...itemData[index],status:!item.status};
itemData[index] = updatedItem;
setdata(itemData);
} />
</div>
</div>
))
}
</div>
);
}
export default Container;
这样您就可以为每张图片设置状态。希望有用,谢谢