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

React中点击Add product按钮时如何关闭模态窗口?

解决React中点击添加按钮关闭模态窗口的问题

针对你遇到的点击「Add product」按钮无法关闭reactjs-popup模态框的问题,有两种简单的解决方案:

方案一:利用reactjs-popup内置的关闭方法

reactjs-popup的modal模式会自动向子组件传递close函数,直接在子组件中接收并调用即可:

修改CreateProduct组件

import React from 'react';
import {useDispatch} from "react-redux";
import {addProductAction} from "../action/productsAction";
import {ConfigProduct} from "../Utils/configProduct";
import '../css/popup.css'
import '../css/flex.css'
import {Button} from "react-bootstrap";

// 接收Popup传递的close方法
const CreateProduct = ({ close }) => {

    const dispatch = useDispatch()
    const newProduct = new ConfigProduct()
    
    function addProd() {
        dispatch(addProductAction(newProduct))
        close() // 调用关闭方法关闭模态框
    }
    
    return (
            <div className = "popup">
                <h2  style={{textAlign: "center", color: "red"}}>New product</h2>
                <input className="item" placeholder="id" onChange={e => newProduct.idProd = e.target.value}/>
                <input className="item" placeholder="info" onChange={e => newProduct.name = e.target.value}/>
                <input className="item" placeholder="price" onChange={e => newProduct.infoProd = e.target.value}/>
                <input className="item" placeholder="date" onChange={e => newProduct.price = e.target.value}/>
                <input className="item" placeholder="enter url" onChange={e => newProduct.date = e.target.value}/>
                <p>
                    <Button onClick={addProd}>Add product</Button>
                </p>
            </div>
    );
};

export default CreateProduct;

Main组件无需修改,Popup会自动将close函数传递给子组件CreateProduct。

方案二:手动维护模态框的显示状态

通过在Main组件中维护isOpen状态,控制模态框的显示与隐藏,适合需要更灵活控制模态框的场景:

修改Main组件

import React, { useState } from 'react';
import CatalogProducts from "./CatalogProducts";
import Info from "./Info";
import CreateProduct from "./CreateProduct";
import {Button} from 'react-bootstrap';
import Popup from 'reactjs-popup';
import 'reactjs-popup/dist/index.css';
import '../css/popup.css'

const Main = () => {
    // 维护模态框的显示状态
    const [isOpen, setIsOpen] = useState(false);

    // 关闭模态框的方法
    const closeModal = () => setIsOpen(false);
    
    return (
        <div>
            <div className="d-flex justify-content-between" style={{ width: '33rem', margin: '10px' }}>
                <Popup 
                    contentStyle={{width: "unset", backgroundColor: "red", border: "none", background: "none"}}
                    trigger={<Button onClick={() => setIsOpen(true)}> Add </Button>} 
                    modal
                    open={isOpen}
                    onClose={closeModal}
                >
                    {/* 将关闭方法传递给CreateProduct */}
                    <CreateProduct onClose={closeModal}/>
                </Popup>
                <input placeholder={'search'}/>
                <span>sort by</span>
                <input/>
            </div>
            <CatalogProducts></CatalogProducts>
            <Info></Info>
        </div>
    );
};

export default Main;

修改CreateProduct组件

import React from 'react';
import {useDispatch} from "react-redux";
import {addProductAction} from "../action/productsAction";
import {ConfigProduct} from "../Utils/configProduct";
import '../css/popup.css'
import '../css/flex.css'
import {Button} from "react-bootstrap";

// 接收父组件传递的onClose方法
const CreateProduct = ({ onClose }) => {

    const dispatch = useDispatch()
    const newProduct = new ConfigProduct()
    
    function addProd() {
        dispatch(addProductAction(newProduct))
        onClose() // 调用关闭方法
    }
    
    return (
            <div className = "popup">
                <h2  style={{textAlign: "center", color: "red"}}>New product</h2>
                <input className="item" placeholder="id" onChange={e => newProduct.idProd = e.target.value}/>
                <input className="item" placeholder="info" onChange={e => newProduct.name = e.target.value}/>
                <input className="item" placeholder="price" onChange={e => newProduct.infoProd = e.target.value}/>
                <input className="item" placeholder="date" onChange={e => newProduct.price = e.target.value}/>
                <input className="item" placeholder="enter url" onChange={e => newProduct.date = e.target.value}/>
                <p>
                    <Button onClick={addProd}>Add product</Button>
                </p>
            </div>
    );
};

export default CreateProduct;

两种方案都能实现点击「Add product」按钮后立即关闭模态框的需求,可根据实际场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:10:24