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

如何在React中用Bootstrap CDN实现表单提交后关闭Modal

解决React中Bootstrap 5 Modal表单提交后关闭的问题

问题背景

已通过CDN在index.html中引入Bootstrap V5,并在React组件的return()中添加了id为modalEditarIntegrante的Bootstrap Modal,希望在表单提交触发的editarIntegrante函数执行完成后关闭该Modal,但当前代码中的modal.hide()无法实现预期效果。

现有Modal代码

<div className="modal fade" id="modalEditarIntegrante" tabIndex="-1" aria-labelledby="modalEditarIntegrante" aria-hidden="true">
    <div className="modal-dialog">
        <div className="modal-content">
            <div className="modal-header">
                <h5 className="modal-title">Editar Integrante</h5>
                <button type="button" className="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div className="modal-body">
                <form onSubmit={editarIntegrante}>
                    <div className="row mb-3 justify-content-between">
                        <div className="col-md-5">
                            <label htmlFor="nombreIntegranteEditar">Nombre</label>
                            <input type="text" id="nombreEditarIntegrante" className="form-control" 
                            value={nombreIntegranteEditar} onChange={(e)=>setNombreIntegranteEditar(e.target.value)}/>
                        </div>
                        <div className="col-md-6">
                            <label htmlFor="apellidoIntegranteEditar">Apellido</label>
                            <input type="text" id="apellidoEditarIntegrante" className="form-control" 
                            value={apellidoIntegranteEditar} onChange={(e)=>setApellidoIntegranteEditar(e.target.value)}/>
                        </div>
                    </div>
                    <div className="row mb-3 justify-content-between">
                        <div className="col-md-7">
                            <label htmlFor="nickIntegranteEditar">Nick</label>
                            <input type="text" id="nickEditarIntegrante" className="form-control"
                             value={nickIntegranteEditar} onChange={(e)=>setNickIntegranteEditar(e.target.value)}/>
                        </div>
                        <div className="col-md-4">
                            <label htmlFor="edadIntegranteEditar">Edad</label>
                            <input type="number" id="edadEditarIntegrante" className="form-control"
                             value={edadIntegranteEditar} onChange={(e)=>setEdadIntegranteEditar(e.target.value)}/>
                        </div>
                    </div>
                    <label htmlFor="juegoFavIntegranteEditar">Juego Fav</label>
                    <input type="text" id="juegoFavIntegranteEditar" className="form-control" 
                    value={juegoFavIntegranteEditar} onChange={(e)=>setJuegoFavIntegranteEditar(e.target.value)}/>
                    
                    <div className="modal-footer">
                        <button type="button" className="btn btn-secondary" data-bs-dismiss="modal">Close</button>
                        <button type="submit" className="btn btn-primary">Save changes</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>

现有editarIntegrante函数代码

const editarIntegrante = async (e)=>{
    e.preventDefault();
    await fetch(`${URI}editarIntegrante`,{
        method:'POST',
        headers:{
            'content-type':'application/json'
        },
        body: JSON.stringify({
            'idIntegranteEditar': idIntegranteEditar,
            'nombreIntegrante': nombreIntegranteEditar,
            'apellidoIntegrante':apellidoIntegranteEditar,
            'nickIntegrante':nickIntegranteEditar,
            'desIntegrante':desIntegranteEditar,
            'edadIntegrante': edadIntegranteEditar,
            'juegoFavIntegrante': juegoFavIntegranteEditar,
            'imgIntegrante':imgIntegranteEditar
        })
    }).then(res=>res.json()).then(data=>{
        obtenerIntegrantes();
        let modal = document.getElementById('modalEditarIntegrante') 
        modal.hide();
        
    })
}

解决方案

核心原因

Bootstrap 5的Modal不能直接通过DOM元素调用hide()方法,必须通过Bootstrap提供的Modal类创建实例后,调用实例的方法来控制显示/隐藏。

方法1:修复现有函数(直接DOM获取)

修改editarIntegrante函数,使用Bootstrap的Modal实例来关闭弹窗:

const editarIntegrante = async (e)=>{
    e.preventDefault();
    try {
        const res = await fetch(`${URI}editarIntegrante`,{
            method:'POST',
            headers:{
                'content-type':'application/json'
            },
            body: JSON.stringify({
                'idIntegranteEditar': idIntegranteEditar,
                'nombreIntegrante': nombreIntegranteEditar,
                'apellidoIntegrante':apellidoIntegranteEditar,
                'nickIntegrante':nickIntegranteEditar,
                'desIntegrante':desIntegranteEditar,
                'edadIntegrante': edadIntegranteEditar,
                'juegoFavIntegrante': juegoFavIntegranteEditar,
                'imgIntegrante':imgIntegranteEditar
            })
        });
        const data = await res.json();
        obtenerIntegrantes();
        
        // 正确关闭Modal的代码
        const modalElement = document.getElementById('modalEditarIntegrante');
        // 先检查是否已有实例,避免重复创建
        const modalInstance = window.bootstrap.Modal.getInstance(modalElement) || new window.bootstrap.Modal(modalElement);
        modalInstance.hide();
    } catch (error) {
        console.error('编辑失败:', error);
    }
}

方法2:React式优化(使用useRef)

为了更符合React的编程习惯,避免直接操作DOM,可以使用useRef来获取Modal元素:

  1. 在组件内引入并创建ref:
import { useRef } from 'react';

const YourComponent = () => {
    const modalRef = useRef(null);
    // ...其他状态和函数
  1. 在Modal元素上绑定ref:
<div className="modal fade" ref={modalRef} id="modalEditarIntegrante" tabIndex="-1" aria-labelledby="modalEditarIntegrante" aria-hidden="true">
    <!-- Modal内容不变 -->
</div>
  1. 修改editarIntegrante函数中的关闭逻辑:
// ...其他代码
obtenerIntegrantes();

const modalInstance = window.bootstrap.Modal.getInstance(modalRef.current) || new window.bootstrap.Modal(modalRef.current);
modalInstance.hide();
// ...其他代码

内容的提问来源于stack exchange,提问作者Shakur23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:50:45