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

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


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

图片.png

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>


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

图片.png

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

图片.png

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

图片.png

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(); //重新获取数据

          }

        },

      });

    };


这段代码


进行接口调用

图片.png

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引入 控制是否必填 接口调用参数直接拼接使用 秒呀


相关文章
|
3月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
40 0
|
1月前
|
前端开发 JavaScript 安全
使用React、TypeScript和Ant Design构建现代化前端应用
使用React、TypeScript和Ant Design构建现代化前端应用
24 0
|
2月前
|
存储 前端开发 中间件
React组件间的通信
React组件间的通信
15 1
|
2月前
|
前端开发 应用服务中间件 数据库
react服务端组件
react服务端组件
21 0
|
2月前
|
前端开发 JavaScript
快速上手React:从概述到组件与事件处理
快速上手React:从概述到组件与事件处理
|
3月前
|
前端开发 JavaScript API
React组件生命周期
React组件生命周期
74 1
|
3月前
|
资源调度 前端开发 JavaScript
React组件
React组件
41 0
|
3月前
|
设计模式 前端开发 数据可视化
【第4期】一文了解React UI 组件库
【第4期】一文了解React UI 组件库
95 0
|
3月前
|
存储 前端开发 JavaScript
【第34期】一文学会React组件传值
【第34期】一文学会React组件传值
31 0
|
3月前
|
前端开发
【第31期】一文学会用React Hooks组件编写组件
【第31期】一文学会用React Hooks组件编写组件
34 0