前端学习案例-手把手教你封装一个ant design的审核框组件

这边先上代码

然后我们逐个解释

    import React, { Component, Fragment } from 'react';
    import { Modal, Row, Form, Col, Radio, Tag, Input, message } from 'antd';
     
    /**
     * 弹框 审核
     * @param {String}  requestUrl       请求 url {必填}
     * @param {Object}  requestParams    请求参数
     *
     * @param {Array}   checkHandleList  单选数据(审核通过,驳回)
     * @param {Array}   checkTagList     备注快捷便签 list
     * @param {Boolean}  modalShow       弹窗显示
     *
     */
    @Form.create()
    class BaseCheck extends Component {
      constructor(props) {
        super(props);
        //控制弹出框的开启
        this.state = {
          loading: false,
        };
      }
      //控制父组件可以调用子组件的方法
      componentDidMount() {
        this.props.onRef && this.props.onRef(this);
      }
     
      // 点击确定 校验并请求
      handleOkCheck = () => {
        this.props.form.validateFieldsAndScroll(['checkRadio', 'checkRemark'],
    (error, values) => {
          if (error) {
            return;
          }
     
          const { checkHandleList } = this.props;
     
          const arr = checkHandleList.filter((item) => item.key ===
    values.checkRadio);
     
          if (arr[0].isRequired && !values.checkRemark) {
            Modal.error({
              title: '提示',
              content: '请输入驳回备注',
            });
            return;
          }
          this.checkRequest(values);
        });
      };
      //处理接口请求
      checkRequest = async (values) => {
        this.setState({ loading: true });
        let { requestUrl, requestParams = {} } = this.props;
        try {
          const res = await requestUrl({
            ...requestParams,
            approveAction: values.checkRadio,
            approveMemo: values.checkRemark,
          });
          if (res.returnCode == 0) {
            message.success('提交成功');
            //提交成功的回调
            this.props.onOk && this.props.onOk();
          } else {
            message.warning(res.returnMsg);
          }
        } catch (error) {
        } finally {
          this.setState({ loading: false });
        }
      };
      //取消的时候的回调
      handleCancelCheck = () => {
        this.props.onCancel && this.props.onCancel();
      };
     
      // 点击快捷备注标签
      tagClick = (item) => {
        this.props.form.setFieldsValue({
          checkRemark: item.value,
        });
      };
     
      // 初始化备注
      initRemarkFn = () => {
        this.props.form.setFieldsValue({
          checkRemark: '',
        });
      };
     
      render() {
        const {
          form: { getFieldDecorator },
          checkTagList = [],
          modalShow,
          checkHandleList = [],
          radioMsg,
        } = this.props;
        const style = {
          position: 'relative',
          top: '-20px',
          left: '120px',
          color: '#1890ff',
        };
        return (
          <Fragment>
            <Modal
              maskClosable={false}
              title="审核"
              visible={modalShow}
              width={550}
              onOk={this.handleOkCheck}
              onCancel={this.handleCancelCheck}
            >
              <Form labelCol={{ span: 6 }} wrapperCol={{ span: 18 }}
    layout={'inline'}>
                <Row span={24}>
                  <Col span={24}>
                    <Form.Item label={'审核'} style={{ width: '100%' }}>
                      {getFieldDecorator('checkRadio', {
                        rules: [{ required: true, message: '请选择是否审核通过' }],
                      })(
                        <Radio.Group>
                          {checkHandleList.map((item) => {
                            return (
                              <Radio value={item.key} key={item.key}>
                                {item.value}
                              </Radio>
                            );
                          })}
                          {/*<Radio value={PRODUCTION_LIBRARY_CHECKED}
    >审核通过</Radio>*/}
                          {/*<Radio value={PRODUCTION_LIBRARY_CHECKNOT
    }>驳回</Radio>*/}
                        </Radio.Group>
                      )}
                    </Form.Item>
                  </Col>
                  {radioMsg && <Col style={style}>{radioMsg}</Col>}
                </Row>
                <Row span={24}>
                  <Col span={24}>
                    <Form.Item label={'备注'} style={{ width: '100%' }}>
                      {getFieldDecorator('checkRemark')(<Input.TextArea />)}
                    </Form.Item>
                  </Col>
                </Row>
                <Row>
                  <Col style={{ paddingLeft: '120px' }}>
                    {checkTagList.map((item, index) => {
                      return (
                        <Tag color="#108ee9" key={index} onClick={() =>
     this.tagClick(item)}>
                          {item.value}
                        </Tag>
                      );
                    })}
                  </Col>
                </Row>
              </Form>
            </Modal>
          </Fragment>
        );
      }
    }
     
    export default BaseCheck;

解释1 这边loding控制接口请求的加载

 解释2 设置单选数据 驳回的时候添加备注

解释3 点击驳回时候的快捷备注

 解释4 如何使用

父组件

       <BaseCheck

              {...checkParams}

              onOk={this.handleOkCheck}

              onCancel={() => {

                this.setState({ checkShow: false });

              }}

              modalShow={checkShow}

            />

    const checkParams = {
          requestUrl: withdrawalRecordReview,
          requestParams: {
            codeList: selectedRowKeys,
          },
          checkTagList,
          checkHandleList: [
            {
              key: BOOTH_TYPE_ACCEPT_ACCEPT,
              value: '审核通过',
              isRequired: false, // 标志 是否必填备注
            },
            {
              key: BOOTH_TYPE_REFUSE_REFUSE,
              value: '驳回',
              isRequired: true, // 标志 是否必填备注
            },
          ],
        };

实现总效果

     则功能实现 有什么疑问欢迎一起探讨
 

posted @   前端导师歌谣  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示