import React, {Component} from 'react'; import {Form, Button, Modal, Checkbox} from 'antd'; // 表单Layout布局 const formLayout = { labelCol: {span: 7, offset: 1}, wrapperCol: {span: 21 - 6}, }; class Class extends Component { constructor(props) { super(props); this.state = { serviceData: { serviceList: [ // 复选框数据 {id: '1', serviceProviderName: '嘻嘻嘻'}, {id: '2', serviceProviderName: '出场费'}, {id: '3', serviceProviderName: '嘻嘻嘻'}, {id: '4', serviceProviderName: '顶顶顶'}, {id: '5', serviceProviderName: '大大大'}, {id: '6', serviceProviderName: '啊啊啊'}, {id: '7', serviceProviderName: '急急急'}, {id: '8', serviceProviderName: '也一样'}, {id: '9', serviceProviderName: '的关系'}, {id: '10', serviceProviderName: '而法国'}, ], serviceProviders: [ // 复选框数据回显 {id: '10', serviceProviderName: '而法国'}, ], }, }; } // 打开开票弹窗 kpModal = (state) => { this.setState({modalShow: state}); } render() { return ( <div> <Button onClick={() => this.kpModal(true)}>开启弹窗</Button> {/* 开票弹窗 */} <KpModalForm modalShow={this.state.modalShow} // 控制弹窗打开/关闭 serviceData={this.state.serviceData} // 子组件需要的数据 closeModal={() => this.kpModal(false)} // 关闭弹窗 /> </div> ); } } const KpModalForm = Form.create()( // eslint-disable-next-line class extends React.Component { constructor(props) { super(props); this.state = { }; } // 单选 isCheckStatus() { const {form, serviceData} = this.props; const serviceProviderIds = form.getFieldValue('serviceProviderIds') || []; let indeterminate = false; let active = false; const arr1 = []; const arr2 = []; serviceData.serviceList.forEach((o) => { if (serviceProviderIds.indexOf(o.id) !== -1) { arr1.push(o); } else { arr2.push(o); } }); if (arr1.length) indeterminate = true; if (arr2.length === 0) { active = true; indeterminate = false; } return {indeterminate, active}; } // 全选 checkAll(all) { const {form, serviceData} = this.props; // 这里能拿到 form 是因为上面 Form.create() 初始化了表单。 if (all) { // 如果不是全选 form.setFieldsValue({serviceProviderIds: []}); // 取消全选,把值设为空。 } else { form.setFieldsValue({serviceProviderIds: serviceData.serviceList.map(item => item.id)}); // 全选,全部赋值。 } } // 提交 onSubmit(e, form) { e.preventDefault(); form.validateFields({force: true}, (err, values) => { if (err) return false; console.log(values, 'values'); // 获取选择的值,获取到的值是根据 getFieldDecorator('serviceProviderIds', {}) 属性来的。 }); } render() { const {modalShow, form, serviceData} = this.props; const {getFieldDecorator} = this.props.form; // 表单验证需要用的 const status = this.isCheckStatus(); // 页面变化就执行,作用是控制复选框全选按钮状态。 return ( <Modal title="新增开票类目" visible={modalShow} onOk={e => this.onSubmit(e, form)} // 把表单绑定到弹窗的确认按钮 onCancel={() => this.props.closeModal()} width={600} afterClose={() => { // 弹窗关闭后,清空表单值。 form.resetFields(); }} > <Form {...formLayout} className="form"> <Form.Item label="应用服务商"> <Checkbox key={-1} value={'all'} style={{marginLeft: 8}} checked={status.active} indeterminate={status.indeterminate} onChange={() => this.checkAll(status.active)} >全选</Checkbox> {getFieldDecorator('serviceProviderIds', { // 数据回显,复选框的默认值 initialValue: serviceData.serviceProviders ? serviceData.serviceProviders.map(e => e.id) : [], rules: [ {required: true, message: '请选择应用服务商'}, ], })( <Checkbox.Group>{ serviceData.serviceList.map((o, index) => ( <Checkbox key={index} value={o.id}>{o.serviceProviderName}</Checkbox>)) } </Checkbox.Group> )} </Form.Item> </Form> </Modal> ); } } ); export default Class;