【问题标题】:React - Close Modal on Form SubmitReact - 提交表单时关闭模式
【发布时间】:2021-07-31 23:12:38
【问题描述】:

React 新手。我正在尝试找出在表单提交事件触发后如何关闭模态框。

export default class UserAdmin extends Component {

constructor(props) {
    super(props);

    this.state = {
        show_user_modal : false
    }
}

// Handle User Modal
handleUserModalOpen = () => {
    this.setState({ show_user_modal: true});
}
handleUserModalClose = () => {
    this.setState({ show_user_modal: false});
}

render() {  
    const { show_user_modal } = this.state;
    return (
        <Content>
            <div className="site-layout-background">
            <div className="contentBody">
                <Button type="primary"onClick={this.handleUserModalOpen}>
                    Add User
                </Button>
                {show_user_modal && <AddUserModal handleClose={this.handleUserModalClose}/>}
            </div>
            </div>
        </Content>
    )
}
}

这可以完美地打开和关闭模式,并且提交在 addUserModal 中完美运行,但是我不确定在完成后我应该如何关闭模式。我试图 setState() 从父级到子级,但它甚至不想显示模态。任何帮助表示赞赏!

**添加addUserModal函数:

function AddUserModal({handleClose}){
    
    const [addUserForm] = Form.useForm();

    /** POST User  */
    const postUser = (values) => {
        axios.post('http://localhost:5000/portal/add-user', values)
            .then(res => {
                if (res.status === 200) {
                    console.log(res.data); 
            }
        })
    };

    return(
        <Modal title="Add User" okText="Confirm" visible={true} onCancel={handleClose}
            onOk={() => {
                addUserForm
                    .validateFields()
                    .then((values) => {
                        postUser(values);
                        addUserForm.resetFields();
                    })
                    .catch((info) => {
                        console.log('Validate Failed:', info);
                    });
                }}
            >
            <Form
                form={addUserForm}
                name="addUserForm"
                labelCol={{span: 5,}}
                wrapperCol={{span: 16,}}
                initialValues={{remember: false,}}
                >
            <Form.Item label="Username" name="username"
                rules={[
                {
                    required: true,
                    message: 'Please input a username!',
                },
                ]}
            >
                <Input />
            </Form.Item>

            <Form.Item label="Email" name="email"
                rules={[
                {
                    required: true,
                    message: 'Please input an email address',
                },
                ]}
                ><Input />
            </Form.Item>
            <Form.Item label="Password" name="password"
                rules={[
                {
                    required: true,
                    message: 'Please input a password',
                },
                ]}
                ><Input.Password />
            </Form.Item>
           </Form>
        </Modal>
        
    );

}
export default AddUserModal;

【问题讨论】:

  • 我想我很困惑,你不能只在 API 调用的 .then 中调用 handleClose 函数。就像handleClose() 就在你的console.log(res.data) 下方或者我错过了什么?
  • 我可以在 AddUserModal 中添加一个 handleclose() 函数,但它不会更新 UserAdmin 组件中的状态,因此它会关闭模式,但如果不刷新页面就无法再次打开它。有没有办法可以从我的函数中访问函数“handleUserModalClose”?或者访问UserAdmin类的状态,将状态改为false?

标签: reactjs react-hooks


【解决方案1】:

您的模态框的visible 属性始终设置为true。将show_user_modal 变量传递给孩子并在模态visiblestate 中使用它。 {show_user_modal &amp;&amp; &lt;AddUserModal... 是不必要的

【讨论】:

    【解决方案2】:

    handleClose 正在呼叫handleUserModalClose。我认为这个问题是另外一回事。因此,您可以尝试在 API 调用的 .then 中调用 handleClose 并同时传递 visible prop

    export default class UserAdmin extends Component {
    
    constructor(props) {
        super(props);
    
        this.state = {
            show_user_modal : false
        }
    }
    
    // Handle User Modal
    handleUserModalOpen = () => {
        this.setState({ show_user_modal: true});
    }
    handleUserModalClose = () => {
        this.setState({ show_user_modal: false});
    }
    
    render() {  
        const { show_user_modal } = this.state;
        return (
            <Content>
                <div className="site-layout-background">
                <div className="contentBody">
                    <Button type="primary"onClick={this.handleUserModalOpen}>
                        Add User
                    </Button>
                    {show_user_modal && <AddUserModal visible={show_user_modal} handleClose={this.handleUserModalClose}/>}
                </div>
                </div>
            </Content>
        )
    }
    }
    

    并在 AddUserModal 中使用它

    function AddUserModal({visible, handleClose}){
        
        const [addUserForm] = Form.useForm();
    
        /** POST User  */
        const postUser = (values) => {
            axios.post('http://localhost:5000/portal/add-user', values)
                .then(res => {
                    if (res.status === 200) {
                        console.log(res.data);
                        handleClose(); 
                    }
            })
        };
    
        return(
            <Modal title="Add User" okText="Confirm" visible={visible} onCancel={handleClose}
                onOk={() => {
                    addUserForm
                        .validateFields()
                        .then((values) => {
                            postUser(values);
                            addUserForm.resetFields();
                        })
                        .catch((info) => {
                            console.log('Validate Failed:', info);
                        });
                    }}
                >
                <Form
                    form={addUserForm}
                    name="addUserForm"
                    labelCol={{span: 5,}}
                    wrapperCol={{span: 16,}}
                    initialValues={{remember: false,}}
                    >
                <Form.Item label="Username" name="username"
                    rules={[
                    {
                        required: true,
                        message: 'Please input a username!',
                    },
                    ]}
                >
                    <Input />
                </Form.Item>
    
                <Form.Item label="Email" name="email"
                    rules={[
                    {
                        required: true,
                        message: 'Please input an email address',
                    },
                    ]}
                    ><Input />
                </Form.Item>
                <Form.Item label="Password" name="password"
                    rules={[
                    {
                        required: true,
                        message: 'Please input a password',
                    },
                    ]}
                    ><Input.Password />
                </Form.Item>
               </Form>
            </Modal>
            
        );
    
    }
    export default AddUserModal;
    

    【讨论】:

    • 谢谢!我明白它现在是如何工作的。我忽略了 handleClose() 被传递给孩子的事实。
    猜你喜欢
    • 2016-04-17
    • 2011-06-03
    • 2021-08-02
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多