You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在map函数中使用React Bootstrap Modal遇到三类异常问题

解决React Table中Modal的三个问题

问题1:模态框弹出时背景完全变黑

原因:你在map循环里给每一行都渲染了一个Modal,每个Modal都会生成独立的背景遮罩(backdrop)。当点击按钮触发显示状态时,多个半透明遮罩叠加后就变成了纯黑色。

解决:把Modal从循环中抽离,整个页面只保留一个全局Modal,通过状态控制它的显示/隐藏和内容。


问题2:弹出多个模态框上下叠加

原因:循环内每一行都对应一个Modal,当isLoaded状态变为true时,所有Modal都会同时显示,导致叠加。

解决:移除循环内的Modal,只在组件全局渲染一个Modal。


问题3:所有Modal显示相同的about文本

原因:用同一个isLoaded状态控制所有Modal,状态更新时循环内的所有Modal都会尝试渲染,React的更新机制会导致最后一个循环项的employeeData.about被复用,或者所有Modal绑定了同一引用。

解决:用状态变量存储当前点击的员工数据,Modal直接读取该状态中的内容。


修改后的完整代码示例

import { useState } from 'react';
import { Button, Modal } from 'react-bootstrap';

const EmployeeTable = ({ employees }: { employees: any[] }) => {
  // 存储当前选中的员工数据
  const [selectedEmployee, setSelectedEmployee] = useState<any>(null);
  // 控制Modal显示/隐藏
  const [isModalOpen, setIsModalOpen] = useState(false);

  const openModal = (employee: any) => {
    setSelectedEmployee(employee);
    setIsModalOpen(true);
  };

  const closeModal = () => {
    setIsModalOpen(false);
    setSelectedEmployee(null);
  };

  const trDiv = { /* 你的行样式 */ };

  return (
    <>
      <table>
        <tbody>
          {employees.map((employeeData: any, index: any) => (
            <tr key={index} style={trDiv}>
              <td>
                <img
                  style={{ minWidth: '120px', maxWidth: '140px' }}
                  src={employeeData.imageUrl}
                  alt=""
                  className="card-img-top img-thumbnail"
                />
              </td>
              <td>
                {employeeData.firstName} {index}
              </td>
              <td>{employeeData.lastName}</td>
              <td>{employeeData.adress}</td>
              <td>{employeeData.email}</td>
              <td>{employeeData.contactNumber}</td>
              <td>{employeeData.position}</td>
              <td>
                {/* 点击时传入当前员工数据 */}
                <Button variant="primary" onClick={() => openModal(employeeData)}>
                  View
                </Button>
              </td>
              <td>{employeeData.manager_id}</td>
              <td>
                {new Date(employeeData.created_at).toLocaleDateString() +
                  ' ' +
                  new Date(employeeData.created_at).toLocaleTimeString()}
              </td>
              <td>
                {new Date(employeeData.updated_at).toLocaleDateString() +
                  ' ' +
                  new Date(employeeData.updated_at).toLocaleTimeString()}
              </td>
            </tr>
          ))}
        </tbody>
      </table>

      {/* 全局唯一的Modal,放在循环外部 */}
      <Modal show={isModalOpen} onHide={closeModal}>
        <Modal.Header closeButton>
          <Modal.Title>员工详情</Modal.Title>
        </Modal.Header>
        {/* 可选链避免空值报错 */}
        <Modal.Body>{selectedEmployee?.about}</Modal.Body>
        <Modal.Footer>
          <Button variant="secondary" onClick={closeModal}>
            Close
          </Button>
          <Button variant="primary" onClick={closeModal}>
            Save Changes
          </Button>
        </Modal.Footer>
      </Modal>
    </>
  );
};

export default EmployeeTable;

内容的提问来源于stack exchange,提问作者Danko Grgić

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:02:31