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

Jim_Zheng
  • 6

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

回复
阅读 11.4k
2 个回答

两种解决办法
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
lxmetlx
  • 1
新手上路,请多包涵

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

你知道吗?

宣传栏