antd4 Form

311 阅读2分钟

最近在做公司项目,好久都没有使用过antdesign 的 form 组件了,上次使用还是,antd3.x的版本的form,只记得是通过Form.create()高阶函数给所编写的组件传递了form对象,该对象身上拥有获取字段值,重置字段值以及 valieate 表单等一些列的form方法。这次,公司的antd的版本升级到了4.x,又有关于表单的需求,于是打开文档一看,发现一切好像都变了,但仔细看下来发现,文档已经在积极拥抱react hooks 了,如果你是在class 组件中使用的话,要仔细去看一下,文档中关于class组件的处理方法。最关键的就是 form 的获取方式,之前是通过Form.create 来传递的,现在需要自己使用ref来绑定form从而获得改form对象,以及操作方法,废话不多说,看代码就知道了

import React, { Component } from 'react';
import style from './manage.scss';
import Cns from 'classnames';
import {isNotEmpty, overtopOmit} from 'utils/formatter';
import {OtherNameCheck} from 'utils/validator';
import {   Form, Input} from 'antd';
import { UploadOutlined } from '@ant-design/icons';
const { TextArea } = Input;

class AtomTable extends Component {
   constructor(props){
       super(props);
       this.state = {
           disable: false
       };
   }
   formRef = React.createRef();    // 重点
   editModal=(record)=>{
       this.setState({
           visible: true,
           type: 'editor',
           id: record.id
       });
       setTimeout(() => {
           this.formRef.current.setFieldsValue({      // 数据回显
               keyWord: record.keyWord,
               labelName: record.labelName
           });
       }, 200);
      
   }

 
   onCheck = async () => {
       try {
           const values = await this.formRef.current.validateFields();
           let params = {
               keyWord: values.keyWord,
               labelName: values.labelName
           };
           if(this.state.type === 'add'){
               this.setState({
                   disable: true
               });
               addLabel(params).then(
                   (p, index)=>{
                     
                       message.success('新增成功');
                       this.handleCancel();
                       this.upData();
                       this.formRef.current.setFieldsValue({
                           keyWord: '',
                           labelName: ''
                       });
                       this.setState({
                           disable: false
                       });
                   }
               ).catch(
                   (err)=>{
                       this.setState({
                           disable: false
                       });
                   }
               );
           }else{
               editorLabel(Object.assign({id: this.state.id}, params)).then(
                   (p, index)=>{
                      
                       message.success('编辑成功');
                       this.formRef.current.setFieldsValue({
                           keyWord: '',
                           labelName: ''
                       });
                       this.setState({
                           disable: false
                       });
                       this.handleCancel();
                       this.upData();
                       
                   }
               ).catch(
                   (err)=>{
                       this.setState({
                           disable: false
                       });
                   }
               );
           }
           
       } catch (errorInfo) {
           // console.log('Failed:', errorInfo);
       }
   };

   componentWillUnmount() {
       this.setState = (state, callback) => {
           return;
       };
   }
    // 自定义校验, Promise 取代  try catch
   kuoValidator=(rule, value )=>{
       let str = value.match(/[()]/g, '');
       let flag = true;
       if(str){
           str =  str.join('');
       }
       if(isNotEmpty(str)){
           flag = str.indexOf('((') === -1  && str.indexOf('))') === -1;
       }
       if (flag) {
           return  Promise.resolve();
       }else{
           return  Promise.reject('不支持多重括号');
       }
   }

   render() {
       const {fileList, uploading, value, total, visible1, visible, fileType, selectedRowKeys, dataSource, currentPage, pageSize, loading, disable } = this.state
      //  格式
       const layout = {
           labelCol: {
               span: 4
           },
           wrapperCol: {
               span: 16
           }
       };
       const formTailLayout = {
           wrapperCol: {
               offset: 8,
               span: 16
           }
          
       };
       const fileName = fileType === 'all' ? '原子标签体系-全量导入.csv' : '原子标签体系-单个导入.csv';
       return (
           <div className={Cns('labelBox')}  >
               <Modal
               width={892}
               title={'原子标签编辑'}
               visible={visible}
               onCancel={this.handleCancel}
               className={Cns('globalModal', style.del)}
               footer={null}
               >
               <div className={style.editCotent}>
               <Form {...layout} ref={this.formRef} name="control-ref" onFinish={this.onFinish}>
                   <Form.Item
                   name="labelName"
                   label="原子标签名称"
                   rules={[
                       {
                           required: true, message: '请输入原子标签名称'
                       },
                       OtherNameCheck('原子标签名称',  1, 20),
                       , { validator: this.kuoValidator, message: '不支持多重括号'}
                   ]}
                   // validateTrigger= "onSubmit" // 设置进行表单验证的时机为onSubmit
                   >
                   <Input />
                   </Form.Item>
                   <Form.Item
                   name="keyWord"
                   label="包含关键词:"
                   rules={[
                       {
                           required: true, message: '请输入关键词'
                       }
                   ]}
                   >
                   <TextArea
                       value={value}
                       placeholder="关键词用英文逗号“,”或中文逗号“,”分割"
                       autoSize={{ minRows: 3, maxRows: 5 }}
                       maxLength={200}
                   />
                   </Form.Item>
                   <Form.Item {...formTailLayout}>
                       <Button type="primary" onClick={this.onCheck}  disabled={disable}  >
                        保存
                       </Button>
                       &emsp;&emsp;&emsp;
                       <Button type="primary" onClick={this.handleCancel}>
                        取消
                       </Button>
                   </Form.Item>
               </Form>
               </div>
           </Modal>
          
           </div>
       );
   }
}

export default AtomTable;

代码案例是我从网上copy的,最关键的代码都有体现,其实文档中也讲得很明白,只是我一开始没看到,哈哈~