1、基本概述

   在上一篇博客:基于Umi搭建的个人Dva脚手架(四) - 可配置的表单组件封装中,已经详细介绍了通过配置生成表单组件的方法,在开发中我们不必过分关心view层的编码,可以减少重复代码的编写,提高开发效率。列表搜索和操作类弹窗(新增、修改等)等都会应用到表单元素,因此在已有的可配置的表单组件GenerateForm的基础上进行二次封装,分别封装了可配置的搜索组件ListFilter和可配置弹窗组件GenerateModal;下边就分别对ListFilter和GenerateModal进行说明,


2、ListFilter的实现

  2.1 、原型图

  列表搜索的原型大致如下,如有原型布局与下图不一致,可自行调整样式文件。考虑到列表搜索时,基本上占据了屏幕的内容区,因次默认一排排列3个元素,可自行通过表单配置中的span属性去更改;

  2.2 、具体实现

  具体的代码实现如下。引入GenerateForm组件,用来控制表单元素的生成。

    import React, {Component} from 'react'import {Button} from 'antd';import GenerateForm from '../GenerateForm'import styles from './index.less'export default class ListFilter extends React.Component {/*搜索*/onSearch = () => {this.listFilter.verify((error, values) => {if (error) {return}this.props.onSearch && this.props.onSearch(values);})}/*重置*/onReset = () => {this.getForm.resetFields();/*对外暴露reset方法*/this.props.onReset && this.props.onReset()}/*对外暴露Form的实例*/getForm = () => {return this.listFilter.getForm();}render() {const {filters,hasSearchBtn = true,hasResetBtn = true,searchBtnText = '查询', /* 搜索按钮文案*/resetBtnText = '清除' /* 清除按钮文案*/} = this.props;/*搜索列表如果没有设置, 默认为一行3个*/filters.forEach(item => {if (!item.span) {item.span = 8;}})return (<div><div className={styles.listFilterWrap}><GenerateForm formSet={filters} wrappedComponentRef={el => (this.listFilter = el)}/><div className={styles.btnGroup}>{hasSearchBtn && <Button type="primary" onClick={this.onSearch}>{searchBtnText}</Button>}{hasResetBtn && <Button type="default" onClick={this.onReset}>{resetBtnText}</Button>}</div></div></div>)}}

  具体的分析如下:

  (1)、props属性:一共接受七个属性,分为5个属性和2个方法:

   – filters:表单元素的配置,传递给GenerateForm组件,用于生成表单;

   – hasSearchBtn、hasResetBtn:用于控制是否生成搜索、清楚按钮,默认都显示;

   – searchBtnText、resetBtnText:用于控制搜索、清楚按钮文案,默认都显示为“查询”、“清楚”;

   – onSearch、onReset:分别用来控制查询、清空按钮的事件处理;

  (2)、render方法:通过GenerateForm组件生成表单元素,表单元素的配置体现在filters属性中,由于GenerateForm被Form.create()作用,因为如需调用GenerateForm内部的方法和属性,则只能通过wrappedComponentRef属性(类似于ref);

  (3)、组件方法:一共提供了3个组件方法:

   – onSearch :首先对表单元素校验,然后将按钮事件传递给props中的onSearch处理;

   – onReset :首先清空表单元素,然后将按钮事件传递给props中的onReset处理;

   – getForm :对外暴露表单的元素的form对象,在实际业务中,可能会需要调用form的一些方法,例如表单密码确认联动校验等。可以通过该方法获取到方法见ant design的api文档:https://ant-design.gitee.io/components/form-cn/#Form.create(options)


3、GenerateModal组件的实现

  3.1 、原型图

   弹窗的原型大致如下,如有原型布局与下图不一致,可自行调整样式文件。由于弹窗宽度有限,因此默认一排排列2个元素,可自行通过表单配置中的span属性去更改;

  3.2 、具体实现

  具体的代码实现如下。引入GenerateForm组件,用来控制表单元素的生成,Modal组件用来生成弹窗。

import React from 'react'
import {Modal, Button} from 'antd';
import GenerateForm from '../GenerateForm'
import styles from './index.less'export default class GenerateModal extends React.Component {/*确定*/handelOk = () => {this.generateModal.verify((error, values) => {if (error) {return}this.props.onOk && this.props.onOk(values);})}/*取消*/handelCancel = () => {this.props.onCancel && this.props.onCancel();}/*对外暴露Form的实例*/getForm = () => {return this.generateModal.getForm();}render() {const {modalForm, visible, key, title, width = 700, hasOkBtn = true, okText = '确定', hasCancelBtn = true, cancelText = '取消'} = this.props;const modalOpts = {visible,key,title,width,maskClosable: false,onCancel: this.handelCancel,footer: <div>{hasCancelBtn && <Button onClick={this.handelCancel}>{cancelText}</Button>}{hasOkBtn && <Button onClick={this.handelOk} type="primary">{okText}</Button>}</div>};/*modal弹窗如果没有设置,默认一行2个*/modalForm.forEach(item => {if (!item.span) {item.span = 12;}})return (<Modal {...modalOpts} className={styles.generateModal}><GenerateForm formSet={modalForm} wrappedComponentRef={el => (this.generateModal = el)}/></ Modal>)}
}

  具体的分析如下:

  (1)、props属性:一共接受11个属性,分为9个属性和2个方法:

   – modalForm:表单元素的配置,传递给GenerateForm组件,用于生成表单;

   – visible:用于控制Modal组件显示与隐藏,对应Modal组件的visible属性;

   – key:用于控制Modal组件属性key,通常设置为随机数Math.random();

   – title:用于控制Modal组件标题,对应Modal组件的titie属性;

   – width:用于控制Modal组件的宽度,对应Modal组件的titie属性,这里默认为700,通常项目中大部分弹窗的宽度是一直,可根据时间情况更改此参数;

   – hasOkBtn、hasCancelBtn:用于控制弹窗是生成确定、取消按钮,默认都显示;

   – okText、cancelText:用于控制按钮文案,默认都显示为“确定”、“取消”;

   – onOk、onCancel:分别用来控制确定、取消按钮的事件处理;

  (2)、render方法:通过GenerateForm组件生成表单元素,表单元素的配置体现在modalForm属性中,由于GenerateForm被Form.create()作用,因为如需调用GenerateForm内部的方法和属性,则只能通过wrappedComponentRef属性(类似于ref);

  (3)、组件方法:一共提供了3个组件方法:

   – handelOk :首先对表单元素校验,然后将按钮事件传递给props中的onOk处理;

   – handelCancel :将按钮事件传递给props中的onCancel处理;

   – getForm :对外暴露表单的元素的form对象,作用同ListFilter。

具体的实例可以参考代码:https://github.com/zhengchangshun/myUmi/tree/master/src/components/business 。


上一篇:基于Umi搭建的个人Dva脚手架(四) - 可配置的表单组件封装


基于Umi搭建的个人Dva脚手架(五) - 可配置的搜索、弹窗组件封装相关推荐

  1. umi搭建react+antd项目(五)子组件编写

    上一篇在index.js里面写了一个组件,不是很友好,我们现在分开写组件 1.新建component文件夹用于放置组件,src/component,新建list组件 import React, {Co ...

  2. 基于Django搭建Python web项目——项目创建及配置(一)

    目录 1.安装Django 2.创建项目 2.1创建第一个项目 2.2开启服务 2.3创建应用 2.4数据迁移 2.5创建管理员用户 2.6生成迁移文件 3.settings配置 4.项目目录结构 1 ...

  3. 基于Docker搭建单机版Mesos/Marathon

    摘要: 本文介绍了基于Docker搭建单机版Mesos/Marathon的方法,Mesos/Marathon的所有组件均运行于单个容器中. GitHub地址: kiwenlau/single-meso ...

  4. php直播平台源码基于 Nginx 搭建(rtmp、http)直播服务器

    php直播平台源码基于 Nginx 搭建(rtmp.http)直播服务器 直播协议介绍 国内常见公开的直播协议有几个:RTMP.HLS.HDL(HTTP-FLV).RTP,我们来逐一介绍. RTMP ...

  5. netty案例,netty4.1中级拓展篇五《基于Netty搭建WebSocket,模仿微信聊天页面》

    前言介绍 本章节我们模仿微信聊天页面,开发一个基于Netty搭建WebSocket通信案例.Netty的应用方面非常广:聊天.MQ.RPC.数据等等,在5G到来的时候更加需要大量数据传输,Netty的 ...

  6. 新手搭建简洁的Express-React-Redux脚手架

    写在前面 我发现网上的很多新手教程都并不是完全针对新手的,新手在使用起来也是丈二的和尚摸不到头脑,最近想用node做后端,react做前端搭建一个小系统,想把过程记录下来,从头开始搭建脚手架,绝对适合 ...

  7. python系统-基于Python搭建Django后台管理系统

    一个好的项目数据库管理后台是必须的,今天代码君教大家搭建Django网站后台,当然做网站后台的前提是需要有Python以及Django的开发环境,至于如何搭建这些开发环境,请查看我的上一篇文章 Mac ...

  8. 前端如何搭建一个成熟的脚手架

    前言 有了之前的基础(前端如何搭建一个简单的脚手架),我们现在可以讲讲一个成熟的脚手架是怎么做了. 这里我们参考vue-cli的源码,基于rollup和typescript一步步搭建.vue-cli作 ...

  9. 基于DataWorks搭建新零售数据中台

    文章作者:许日(欢伯),在2016年盒马早期的时候,转到盒马事业部作为在线数据平台的研发负责人,现任阿里云计算平台DataWorks建模引擎团队负责人. 文章简介:本篇文章向大家分享新零售企业如何基于 ...

最新文章

  1. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...
  2. 修改initrd做miniLinux
  3. 用Scikit-learn和TensorFlow进行机器学习(三)
  4. rxjs里使用from operator从一个generator里生成Observable
  5. android系统里面的mic是哪个app_安利 | 那些错过会后悔一年的法语APP
  6. magento 高级搜索 brand实例 Magento ‘Shop By Brand’ in SideBar
  7. python语法(二)——截取字符串的方法详解
  8. Mysql err 1055
  9. timequest静态时序分析学习笔记之命令约束
  10. 数据--第22课 - 队列的定义及实现
  11. 快递如何筹备双十一:德邦快递另类营销
  12. 【HDU_P3530】Subsequence
  13. 海盗王封WPE的方法
  14. 用html写的意见调查表代码
  15. html id 重复,Apple ID一直重复登录无效!怎么处理!
  16. 大自然教给我们“知足”的生存方式
  17. NodeJS 创建静态资源服务器
  18. 顶级域名后缀有哪些?这份科普请好好收藏!
  19. 北京航天技术交流之行:北京和上海地铁的观感
  20. PHP开发手机自动拨号软件

热门文章

  1. 微信H5游戏开发需要注意什么?
  2. 我写的一个以词搜图系统0.0.0版本
  3. AIX如何管理LPP及强制删除LPP
  4. 又一“刚需”经济崛起,“Artas们”能否成为秃头人群的心头好?
  5. 拼团秒杀功能,小程序商城能比得过拼多多吗?
  6. 计算机话筒技术指标,话筒的主要技术指标
  7. 【记录】 Android 双卡手机获取IMEI等
  8. 小程序获取表单输入值
  9. baiduMap试手《办理进京证和市区警察查询进京证的地址浏览》
  10. App自动化测试(五)之swipe滑动操作