0
点赞
收藏
分享

微信扫一扫

#yyds干货盘点# React手把手教你封装一个ant design的审核框组件

    我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣


   获取前端学习知识


1设计需求 封装一个弹框组件 直接调用接口

#yyds干货盘点# React手把手教你封装一个ant design的审核框组件_封装

2技术栈 ant design+react


设计第一步


绘制样式


    <Modal

           maskClosable={false}

           visible={visible}

           title={'签收协议'}

           onOk={this.handleSignFor}

           onCancel={() => this.onOpenOrClose(false)}

           width={800}

           destroyOnClose

         >

           <Form

             {...formItemLayout}

             // className={styles}

             style={{ paddingTop: '0px' }}

             wrapperCol={{ span: 16 }}

           >

             <Form.Item label="签收结果">

               {getFieldDecorator('signInResult',

   {

                 initialValue: ResultQsList.length > 0 ?

    ResultQsList[1].key : '',

                 rules: [{ required: true, message: '请选择签收结果' }],

               })(

                 <Radio.Group>

                   {ResultQsList.map((item) => {

                     return (

                       <Radio value={item.key} key={item.key}>

                         {item.value}

                       </Radio>

                     );

                   })}

                 </Radio.Group>

               )}

             </Form.Item>

             <Form.Item label="甲方名称">

               {getFieldDecorator('firstPartyName', {

                 rules: [{ required: true, message: '甲方名称不能为空' }],

               })(

                 <Select style={{ width: '100%' }}>

                   {test.map((item) => (

                     <Select.Option key={item.key} value={item.key}>

                       {item.value}

                     </Select.Option>

                   ))}

                 </Select>

               )}

             </Form.Item>

             <Form.Item label="乙方名称">

               {getFieldDecorator('secondPartyName', {

                 rules: [{ required: true, message: '乙方名称不能为空' }],

               })(

                 <Select style={{ width: '100%' }}>

                   {test.map((item) => (

                     <Select.Option key={item.key} value={item.key}>

                       {item.value}

                     </Select.Option>

                   ))}

                 </Select>

               )}

             </Form.Item>

             <Form.Item label="归档编号">

               {getFieldDecorator('archivedEncode', {

                 initialValue: 1,

                 rules: [{ required: true, message: '请输入归档编号' }],

               })(

                 <InputNumber

                   formatter={(value) => `HZ ${value}`}

                   style={{ width: '100%' }}

                   placeholder="请输入"

                   onChange={this.handleArchivedEncode}

                 />

               )}

             </Form.Item>

             {/* 控制验证的规则 */}

             <Form.Item label="原因">

               {getFieldDecorator(

                 'signInResson',

                 form.getFieldsValue().signStatus === QS_TESHU ||

                   form.getFieldsValue().signStatus === JS_TESHU

                   ? {

                       initialValue: '',

                       rules: [{ required: true, message: '请填写原因' }],

                     }

                   : { rules: [{ message: '请填写原因' }] }

               )(

                 <Select style={{ width: '100%' }}>

                   {ResultYyList.map((item) => (

                     <Select.Option key={item.key} value={item.key}>

                       {item.value}

                     </Select.Option>

                   ))}

                 </Select>

               )}

             </Form.Item>

             <Form.Item label="备注">

               <div>

                 {getFieldDecorator('signInRemark', { rules: [{ message: '请填写备注'

    }] })(

                   <TextArea allowClear placeholder="请填写备注" autoSize={{ minRows: 3

    }} />

                 )}

               </div>

             </Form.Item>

           </Form>

         </Modal>


这样就渲染了如图所示的样式

#yyds干货盘点# React手把手教你封装一个ant design的审核框组件_封装_02

设计点二 当正常签收的时候原因为非必填 其他两种情况为必填

#yyds干货盘点# React手把手教你封装一个ant design的审核框组件_接口调用_03

形成效果正常签收的时候原因为非必填 其他两种情况为必填

#yyds干货盘点# React手把手教你封装一个ant design的审核框组件_hive_04

3设计思路 这样就形成了判断


这个时候 后台接口是要传code


   handleSignFor = () => {

       //获取到所有的form表单的值

       const formData = this.props.form.getFieldsValue();

       console.log(formData, 'formData');

       //参数拼接

       const param = {

         ...formData,

         code: this.state.code,

         archivedEncode: `HZ${formData.archivedEncode}`,

       };

       console.log(param);

       this.props.dispatch({

         type: 'agreement/signIn',

         payload: param,

         callback: (res) => {

           if (res.returnCode === 0) {

             message.success('协议签收成功');

             this.onOpenOrClose(false);

             this.props.getContractList(); //重新获取数据

           }

         },

       });

     };


这段代码


进行接口调用

#yyds干货盘点# React手把手教你封装一个ant design的审核框组件_接口调用_05

4设计思路 父子组件调用


     <SignForModal

                 onRef={(ref) => {

                   this.SignForModal = ref;

                 }}

                 getContractList={this.getCourseList}

               />


签收的时候直接onref调用子组件的方法


     //签收

     handleSignFor = (row, isBatch) => {

       this.SignForModal.onOpenOrClose(true, row);

     };


所以 封装总代码


   import React, { Component } from 'react';

   import { connect } from 'dva';

   import { Modal, Form, Input, Row, Col, Radio, Button,

    message, InputNumber, Select } from 'antd';

   import { formItemLayout } from '@/common/config';

   import { QS_TESHU, JS_TESHU } from './data.js';

   // import styles from './../../index.less';

   import { CONTRACT_CHECKPASS, CONTRACT_CHECKNOT }

   from '@/utils/dictionaryInterface';

   const { TextArea } = Input;

   //修改数据请求 接口调用请求

   @Form.create()

   @connect(({ agreement, menu, loading }) => ({

     menu,

     agreement,

   }))

   class SignForModal extends Component {

     //控制弹窗的开启

     state = { visible: false, code: '' };

     componentDidMount() {

       this.props.onRef && this.props.onRef(this);

    //父组件通过onRef访问子组件的方法,这里要写上这句话,否则无法访问

     }

     //显示或隐藏modal

     onOpenOrClose = (show, row) => {

       this.setState({ visible: show });

       show && this.setState({ code: row.code });

     };


     handleArchivedEncode = (value) => {};

     //点击确定

     handleSignFor = () => {

       //获取到所有的form表单的值

       const formData = this.props.form.getFieldsValue();

       console.log(formData, 'formData');

       //参数拼接

       const param = {

         ...formData,

         code: this.state.code,

         archivedEncode: `HZ${formData.archivedEncode}`,

       };

       console.log(param);

       this.props.dispatch({

         type: 'agreement/signIn',

         payload: param,

         callback: (res) => {

           if (res.returnCode === 0) {

             message.success('协议签收成功');

             this.onOpenOrClose(false);

             this.props.getContractList(); //重新获取数据

           }

         },

       });

     };

     render() {

       const test = [{ key: '1', value: '公司' }];

       const { visible } = this.state;

       const {

         agreement: { ResultQsList = [], ResultYyList = [] },

         // contractList: { contractCollectionStatusList,

   contractSettlementStatusList, checkStatusList },

         form,

         form: { getFieldDecorator },

       } = this.props;

       return (

         <Modal

           maskClosable={false}

           visible={visible}

           title={'签收协议'}

           onOk={this.handleSignFor}

           onCancel={() => this.onOpenOrClose(false)}

           width={800}

           destroyOnClose

         >

           <Form

             {...formItemLayout}

             // className={styles}

             style={{ paddingTop: '0px' }}

             wrapperCol={{ span: 16 }}

           >

             <Form.Item label="签收结果">

               {getFieldDecorator('signInResult', {

                 initialValue: ResultQsList.length > 0 ? ResultQsList[1].key : '',

                 rules: [{ required: true, message: '请选择签收结果' }],

               })(

                 <Radio.Group>

                   {ResultQsList.map((item) => {

                     return (

                       <Radio value={item.key} key={item.key}>

                         {item.value}

                       </Radio>

                     );

                   })}

                 </Radio.Group>

               )}

             </Form.Item>

             <Form.Item label="甲方名称">

               {getFieldDecorator('firstPartyName', {

                 rules: [{ required: true, message: '甲方名称不能为空' }],

               })(

                 <Select style={{ width: '100%' }}>

                   {test.map((item) => (

                     <Select.Option key={item.key} value={item.key}>

                       {item.value}

                     </Select.Option>

                   ))}

                 </Select>

               )}

             </Form.Item>

             <Form.Item label="乙方名称">

               {getFieldDecorator('secondPartyName', {

                 rules: [{ required: true, message: '乙方名称不能为空' }],

               })(

                 <Select style={{ width: '100%' }}>

                   {test.map((item) => (

                     <Select.Option key={item.key} value={item.key}>

                       {item.value}

                     </Select.Option>

                   ))}

                 </Select>

               )}

             </Form.Item>

             <Form.Item label="归档编号">

               {getFieldDecorator('archivedEncode', {

                 initialValue: 1,

                 rules: [{ required: true, message: '请输入归档编号' }],

               })(

                 <InputNumber

                   formatter={(value) => `HZ ${value}`}

                   style={{ width: '100%' }}

                   placeholder="请输入"

                   onChange={this.handleArchivedEncode}

                 />

               )}

             </Form.Item>

             {/* 控制验证的规则 */}

             <Form.Item label="原因">

               {getFieldDecorator(

                 'signInResson',

                 form.getFieldsValue().signInResult === QS_TESHU ||

                   form.getFieldsValue().signInResult === JS_TESHU

                   ? {

                       initialValue: '',

                       rules: [{ required: true, message: '请填写原因' }],

                     }

                   : { rules: [{ message: '请填写原因' }] }

               )(

                 <Select style={{ width: '100%' }}>

                   {ResultYyList.map((item) => (

                     <Select.Option key={item.key} value={item.key}>

                       {item.value}

                     </Select.Option>

                   ))}

                 </Select>

               )}

             </Form.Item>

             <Form.Item label="备注">

               <div>

                 {getFieldDecorator('signInRemark',

    { rules: [{ message: '请填写备注' }] })(

                   <TextArea allowClear placeholder

   ="请填写备注" autoSize={{ minRows: 3 }} />

                 )}

               </div>

             </Form.Item>

           </Form>

         </Modal>

       );

     }

   }


   export default SignForModal;


   我是歌谣 所以总的实现了一个父子传值 子组件给个方法回调给父getContractList


   回调用来重新刷新列表 直接onref调用组件的方法进行处理数据 状态判断外部定义一个data.js引入 控制是否必填 接口调用参数直接拼接使用 秒呀


举报

相关推荐

0 条评论