reactjs - 使用反应钩子将图像数组中的图像显示到模态
问题描述
我有一个组件,它使用 map 方法从 json 文件中显示本地存储的图像。我想要做的是当我点击任何我希望图像以模态显示的图像时。当我尝试将图像的 id 作为道具传递给模式时,并尝试 console.log 它显示所有可用的 id,但不显示单击图像的 id。
import React, { useState } from "react";
import PropTypes from "prop-types";
import { Card, Modal } from "react-bootstrap";
import { data } from "../assets/images/stuff";
import "../assets/css/aboutUs.css";
const StuffInfo = (props) => {
return (
<Modal {...props} aria-labelledby="contained-modal-title-vcenter" centered>
<Modal.Body>
<div className="col-sm-6 col-md-4 mb-3 stuff">
<Card key={props.id}>
<Card.Img src={data.src} />
<p>{data.stuffName}</p>
<span>{data.title}</span>
</Card>
</div>
</Modal.Body>
</Modal>
);
};
function AboutUs() {
const [showModal, setShowModal] = useState(false);
const [imge, setImge] = useState("");
const handleClick = (id) => {
console.log("Id is", id);
setShowModal(true);
setImge(data[id].src);
console.log("image is", imge);
};
return (
<div className="about-us">
<h3>Lorem Ipsum</h3>
<div className="info">
<p>
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo
</p>
<h4>Lorem Ipsum </h4>
<p>
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo
</p>
</div>
<div className="our-services">
<h4>Lorem Ipsum</h4>
<div className="row">
<div className="col-lg-4 col-md-6 train">
<h5>Lorem Ipsum </h5>
<div className="info-text">
<i
className="fa fa-graduation-cap"
style={{ color: "#ff689b" }}
></i>
<p>
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo
</p>
</div>
</div>
<div className="col-lg-4 col-md-6 train">
<h5>Lorem Ipsum </h5>
<div className="info-text">
<i
className="fa fa-wrench"
aria-hidden="true"
style={{ color: "#e9bf06" }}
></i>
<p>
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo
</p>
</div>
</div>
<div className="col-lg-4 col-md-6 train">
<h5>Lorem Ipsum </h5>
<div className="info-text">
<i
className="fa fa-universal-access"
style={{ color: "#3fcdc7" }}
></i>
<p>
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo
</p>
</div>
</div>
</div>
</div>
<h5>Lorem Ipsum</h5>
<div className="row">
{data &&
data.map((stuff, id) => (
<div
className="col-sm-6 col-md-4 mb-3 stuff"
key={id}
onClick={() => handleClick(id)}
>
<Card key={data.id}>
<img src={stuff.src} id={id} />
<p>{stuff.stuffName}</p>
<span>{stuff.title}</span>
</Card>
<StuffInfo
show={showModal}
onHide={() => setShowModal(false)}
id={data.id}
/>
</div>
))}
</div>
</div>
);
}
export default AboutUs;
StuffInfo.propTypes = {
id: PropTypes.string,
onHide: PropTypes.func,
};
这是我根据建议尝试的代码。
<div className="row">
{data &&
data.map((stuff, id) => (
<div
className="col-sm-6 col-md-4 mb-3 stuff"
key={id}
onClick={() => setImge(id)}
>
<Card key={data.id}>
<img src={stuff.src} id={id} />
<p>{stuff.stuffName}</p>
<span>{stuff.title}</span>
</Card>
</div>
))}
<StuffInfo
show={imge > -1}
onHide={() => setImge(-1)}
id={imge}
data={data}
/>
</div>
</div>
const StuffInfo = ({ data, id }) => {
{
console.log("DATA is", data[id].src, data[id].stuffName, data[id].title);
}
return (
<Modal aria-labelledby="contained-modal-title-vcenter" centered>
<Modal.Body>
<div className="col-sm-6 col-md-4 mb-3 stuff">
<Card key={id}>
<Card.Img src={data[id].src} />
<p>{data[id].stuffName}</p>
<span>{data[id].title}</span>
</Card>
</div>
</Modal.Body>
</Modal>
);
};
解决方案
您拥有StuffInfo
每个数据项,并且它们都共享相同的showModal
标志,因此当您将其翻转为 true 时,它们都会同时显示。而不是 showModal
您可以将所选项目的 id 保持在状态中并根据当前 id 检查它show={data.id === selectedId}
,或者最好还是移到StuffInfo
循环之外,如果您只有一个 StuffInfo
,它看起来像
<StuffInfo
show={selectedId > -1}
onHide={() => setSelectedId(-1)}
id={selectedId}
/>
让你成为一个工作示例https://codesandbox.io/s/react-bootstrap-playground-forked-wkzp5
推荐阅读
- json - django rest框架发布嵌套json
- javascript - 如何在 React admin 中编辑 en Array Input 中的项目?
- python - 在视图中访问 django fk 相关对象作为模板
- r - aggregate.data.frame(as.data.frame(x), ...) 中的错误:参数必须具有相同的长度
- visual-c++ - 您应该默认 HMENU 为 nullptr 还是 0?
- laravel - 检查 Stripe 客户是否存在
- javascript - 我可以使用 Javascript 数组来存储麦克风输入(实时)吗?
- pyspark - 当值为 xx.0 时,AWS Glue PySpark 不聚合键入为 DOUBLE 的值。其他值(例如 xx.89)很好
- php - Xdebug 3:从调用堆栈中隐藏函数参数
- javascript - 如何将 v-model 与 v-for 生成的多个复选框一起使用?