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


相关文章
|
4月前
|
缓存 前端开发 数据安全/隐私保护
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
如何使用组合组件和高阶组件实现复杂的 React 应用程序?
206 68
|
4月前
|
缓存 前端开发 Java
在 React 中,组合组件和高阶组件在性能方面有何区别?
在 React 中,组合组件和高阶组件在性能方面有何区别?
190 67
|
4月前
|
前端开发 JavaScript 安全
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
除了高阶组件和render props,还有哪些在 React 中实现代码复用的方法?
186 62
|
7月前
|
移动开发 前端开发 API
React 音频播放器组件 Audio Player
本文介绍如何使用React创建音频播放器组件,涵盖核心功能如播放/暂停、进度条、音量控制和时间显示。通过HTML5 `&lt;audio&gt;` 元素和React的声明式状态管理,实现交互式音频播放。常见问题包括控件不响应、进度条无法更新和音量控制失灵,并提供解决方案。此外,还讨论了浏览器兼容性、异步错误处理和性能优化等易错点及避免方法。
553 123
|
6月前
|
前端开发 JavaScript
除了使用Route组件,React Router还有其他方式处理404错误页面吗
除了使用Route组件,React Router还有其他方式处理404错误页面吗
158 58
|
6月前
|
前端开发
React 中高阶组件的原理是什么?
React 中高阶组件的原理是什么?
179 57
|
6月前
|
前端开发 开发者
除了函数组件和类组件,React 还有其他创建组件的方式吗?
除了函数组件和类组件,React 还有其他创建组件的方式吗?
148 57
|
6月前
|
前端开发
如何在React Router中定义404错误页面组件?
如何在React Router中定义404错误页面组件?
153 57
|
6月前
|
前端开发
在 React 中使用高阶组件时,如何避免命名冲突?
在 React 中使用高阶组件时,如何避免命名冲突?
155 56
|
6月前
|
移动开发 前端开发 JavaScript
React音频播放列表组件:常见问题、易错点与解决方案
本文介绍了在React中实现音频播放列表时常见的挑战及解决方案。通过基础实现、常见问题分析和最佳实践,帮助开发者避免状态管理、生命周期控制和事件处理中的陷阱。关键点包括使用`useRef`操作音频元素、`useState`同步播放状态、全局状态管理防止多音频同时播放、以及通过`useEffect`清理资源。还提供了代码示例和跨浏览器兼容性处理方法,确保高效实现功能并减少调试时间。
203 30