css - 基于行 onclick 动态呈现模式 - ReactJS
问题描述
正在为一个未公开的项目工作,其中有关患者的数据从他们的 api 中提取并作为模式加载到页面上。当您单击模态时,威胁的更多信息将被拉出为模态。这里的目标是让他们根据 div 在有人点击它时进行渲染。
如何在每次点击时正确地将数据从 api 发送到模态组件?
单击时类似于 div 表
import React, {useState,useEffect} from 'react';
const keys = Object.keys(arr[0]);
// const handleOnClick = param => {
// console.log('do something: ', param);
// }
export default function Demo() {
const [isModalOpen, setModalIsOpen] = useState(false);
const [users, setUsers] = useState([]);
const toggleModal = () => {
setModalIsOpen(!isModalOpen);
};
const handleOnClick = () => {
toggleModal()
};
useEffect(() => {
const fetchUsers = async () => {
try {
const { data } = await axios.get('https://gist.githubusercontent.com/SkyBulk/a75a32254d58aea2cf27cbb43117a2f4/raw/eb5f85560c0dfd74a4aab9db755ac5a06f0627c2/api.json').results;
setUsers(data);
} catch (err) {
console.error("failed", err);
}
setModalIsOpen(false);
};
fetchUsers();
}, []);
return (
<div className="container">
<>
{keys.map((key) => (
<div className="col" key={key}>
<div className="row">{key}</div>
{arr[0][key].map((item) => (
<div className="row" key={item.technique_id} onClick={() => handleOnClick(item)}>{item.technique}</div>
))}
</div>
))}
</>
{isModalOpen && <Modal onRequestClose={handleOnClick} data={users}/>}
</div>
);
}
模态的
import React, { useEffect } from "react";
const Modal = ({ onRequestClose, data }) => {
// Use useEffect to add an event listener to the document
useEffect(() => {
function onKeyDown(event) {
if (event.keyCode === 27) {
// Close the modal when the Escape key is pressed
onRequestClose();
}
}
// Prevent scolling
document.body.style.overflow = "hidden";
document.addEventListener("keydown", onKeyDown);
// Clear things up when unmounting this component
return () => {
document.body.style.overflow = "visible";
document.removeEventListener("keydown", onKeyDown);
};
});
return (
<div className="modal__backdrop">
<div className="modal__container">
<div className="modal-header">
<div className="modal-close" onClick={onRequestClose}>
<svg className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M6 18L18 6M6 6l12 12" />
</svg>
</div>
</div>
<div className="job-title-wrapper">
<div className="job-card-title">{data}</div>
</div>
</div>
</div>
);
};
export default Modal;
解决方案
如果我理解正确,您想在用户单击一行时进行特定的 API 调用并将其数据设置为模式,对吗?
您当前通过您所做的useEffect
只是每次组件中的某些内容更新时总是获取用户数据,根据您的描述,这可能不是您想要的。因此,您可能可以完全删除该块。
相反,您希望在单击该行时调用该 API,因此看起来更合适的位置是在您的handleOnClick
函数上。它应该看起来像这样:
const handleOnClick = async () => {
try {
const { data } = await axios.get('https://gist.githubusercontent.com/SkyBulk/a75a32254d58aea2cf27cbb43117a2f4/raw/eb5f85560c0dfd74a4aab9db755ac5a06f0627c2/api.json').results;
setUsers(data);
// Now that the data has been fetched, open the modal
setModalIsOpen(true);
} catch (err) {
console.error("failed", err);
}
};
像这样,在打开模式时,数据应该全部设置为您的user
状态。通过这些更改,您的Demo
组件应如下所示:
export default function Demo () {
const [isModalOpen, setModalIsOpen] = useState(false);
const [users, setUsers] = useState([]);
const handleOnClick = async () => {
try {
const { data } = await axios.get('https://gist.githubusercontent.com/SkyBulk/a75a32254d58aea2cf27cbb43117a2f4/raw/eb5f85560c0dfd74a4aab9db755ac5a06f0627c2/api.json').results;
setUsers(data);
// Now that the data has been fetched, open the modal
setModalIsOpen(true);
} catch (err) {
console.error("failed", err);
}
};
return (
<div className="container">
<>
{keys.map((key) => (
<div className="col" key={key}>
<div className="row">{key}</div>
{arr[0][key].map((item) => (
<div className="row" key={item.technique_id} onClick={() => handleOnClick(item)}>{item.technique}</div>
))}
</div>
))}
</>
{isModalOpen && <Modal onRequestClose={() => setModalIsOpen(false)} data={users}/>}
</div>
);
}
推荐阅读
- java - 如何根据android中的值设置视图宽度
- python-3.x - 从关联表中删除一行
- python - 如何删除python数据报中的重复行并分配给新数据报但保留原始原始数据帧
- oracle - Oracle GoldenGate 生成表列时始终标识类型_IT 不允许在目标数据库表中插入
- javascript - 如何将数组分配给charts.js的计数数据
- python-3.x - Python - re.sub 返回模式而不是替换
- javascript - 如何从 chrome 存储同步中存储和检索数据
- clojure - `for` 作为函数而不是宏
- git - git rev-parse --short HEAD
- python - Dask dataframe groupby 并应用自定义函数