UNPKG

cjd-parkball

Version:

> 中后台业务组件库,中后台就像公园,进入需要买门票(登录),所以以 Parkball(公园球) 命名,公园内必定捕获!作为一个组件库,提供使用方法文档,方便开发者的调用

145 lines (131 loc) 3.5 kB
--- category: 2 title: 动态增减表单项 title_en: Dynamic Form Item --- zh-CN 动态增加、减少表单项。 en-US Add or remove form items dynamically. ````jsx import { Form, Input, Icon, Button } from 'parkball'; const FormItem = Form.Item; let uuid = 0; class DynamicFieldSet extends React.Component { remove = (k) => { const { form } = this.props; // can use data-binding to get const keys = form.getFieldValue('keys'); // We need at least one passenger if (keys.length === 1) { return; } // can use data-binding to set form.setFieldsValue({ keys: keys.filter(key => key !== k), }); } add = () => { const { form } = this.props; // can use data-binding to get const keys = form.getFieldValue('keys'); const nextKeys = keys.concat(uuid); uuid++; // can use data-binding to set // important! notify form to detect changes form.setFieldsValue({ keys: nextKeys, }); } handleSubmit = (e) => { e.preventDefault(); this.props.form.validateFields((err, values) => { if (!err) { console.log('Received values of form: ', values); } }); } render() { const { getFieldDecorator, getFieldValue } = this.props.form; const formItemLayout = { labelCol: { xs: { span: 24 }, sm: { span: 4 }, }, wrapperCol: { xs: { span: 24 }, sm: { span: 20 }, }, }; const formItemLayoutWithOutLabel = { wrapperCol: { xs: { span: 24, offset: 0 }, sm: { span: 20, offset: 4 }, }, }; getFieldDecorator('keys', { initialValue: [] }); const keys = getFieldValue('keys'); const formItems = keys.map((k, index) => { return ( <FormItem {...(index === 0 ? formItemLayout : formItemLayoutWithOutLabel)} label={index === 0 ? 'Passengers' : ''} required={false} key={k} > {getFieldDecorator(`names[${k}]`, { validateTrigger: ['onChange', 'onBlur'], rules: [{ required: true, whitespace: true, message: "Please input passenger's name or delete this field.", }], })( <Input placeholder="passenger name" style={{ width: '60%', marginRight: 8 }} /> )} {keys.length > 1 ? ( <Icon className="dynamic-delete-button" type="minus-circle-o" disabled={keys.length === 1} onClick={() => this.remove(k)} /> ) : null} </FormItem> ); }); return ( <Form onSubmit={this.handleSubmit}> {formItems} <FormItem {...formItemLayoutWithOutLabel}> <Button type="dashed" onClick={this.add} style={{ width: '60%' }}> <Icon type="plus" /> Add field </Button> </FormItem> <FormItem {...formItemLayoutWithOutLabel}> <Button type="primary" htmlType="submit">Submit</Button> </FormItem> </Form> ); } } const WrappedDynamicFieldSet = Form.create()(DynamicFieldSet); ReactDOM.render(<WrappedDynamicFieldSet />, mountNode); ```` ````css .dynamic-delete-button { cursor: pointer; position: relative; top: 4px; font-size: 24px; color: #999; transition: all .3s; } .dynamic-delete-button:hover { color: #777; } .dynamic-delete-button[disabled] { cursor: not-allowed; opacity: 0.5; } ````