antd modal的OK能否触发内部form的submit?

发布于 2022-09-04 20:13:14 字数 256 浏览 13 评论 0

我看了官方示例,Modal的Ok按钮和form的Submit都是执行一个方法。
我现在想把Modal和Form分开,这样modal部分可以直接指定button和form就行了,不需要写一堆显示,隐藏之类的代码。 但是不知道modal的ok按钮如何触发form的提交?
form的提交往往也是父组件给定的方法,所以一般都有参数,例如 onSubmit(error,values),但是这个方法没法给Ok用,Ok没法提供这两个参数,所以想让Ok触发form的提交,然后只负责隐藏modal。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

小女人ら 2022-09-11 20:13:14

两种解决办法
1、写一个通用的Modal,Form的Submit、Items通过props传递给该Modal
2、给form一个ref,modal的onOK调用 this.refs.form 即可获取form的所有value

当然,这两者并不冲突,可以合在一起,通用的modal + 通用的form

通用的form

import React, { Component, PropTypes } from 'react'
import { Form } from 'antd'

class SharedForm extends Component {
    handleSubmit = () => {
        this.props.form.validateFields((err, values) => {
            console.log(values);
            this.props.onSubmit(err, values);
        });
    }

    render() {
        const children = this.props.children || [];
        const formItemLayout = {
            labelCol: { span: 6 },
            wrapperCol: { span: 14 },
        };
        const { getFieldDecorator } = this.props.form;

        return (
            <Form layout="horizontal" onSubmit={this.handleSubmit}>
                {children.map((item, key) =>
                    item.title ? <Form.Item key={key} label={item.title} {...(item.layout ? item.layout : formItemLayout) }>
                        {getFieldDecorator(item.name, { initialValue: item.defaultValue })(item.render)}
                    </Form.Item>
                        : <span key={key}>{getFieldDecorator(item.name, { initialValue: item.defaultValue })(item.render)}</span>
                )}
            </Form>
        )
    }
}
SharedForm.propTypes = {
    children: PropTypes.array.isRequired,
    onSubmit: PropTypes.func.isRequired,
}
export default Form.create()(SharedForm);

通用的modal

import React, { Component } from 'react'
import { Modal } from 'antd'
import Form from './_form'

class SharedFormModal extends Component {
    state = { visible: false, }
    showModelHandler = (e) => {
        if (e) e.stopPropagation()
        this.setState({ visible: true, })
    }
    hideModelHandler = () => {
        this.setState({ visible: false, })
    }
    handleSubmit = (err, values) => {
        this.refs.form.validateFields((err, values) => {
            this.props.onSubmit(err, values)
            if (!err) {
                this.hideModelHandler()
            }
        });
    }
    render() {
        const { children, trigger } = this.props
        return (
            <span>
                <span onClick={this.showModelHandler}>
                    {trigger}
                </span>
                <Modal title={this.props.name || ''}
                    visible={this.state.visible}
                    onOk={this.handleSubmit}
                    onCancel={this.hideModelHandler}
                >
                    <Form
                        ref="form"
                        onSubmit={this.handleSubmit}
                        children={children}
                    />
                </Modal>
            </span>
        )
    }
}
SharedFormModal.propTypes = {
    trigger: React.PropTypes.element.isRequired,
    children: React.PropTypes.array.isRequired,
    onSubmit: React.PropTypes.func.isRequired
}
export default SharedFormModal
别靠近我心 2022-09-11 20:13:14

你好 这个问题您解决了吗?初学也遇到这个问题了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文