基于React的表单开发的分析(上)

本文主要讲解后台系统与表单相关的页面开发,并分析如何才能更好地、高效地开发。

技术栈

  • React
  • Antd

背景

Antd

以下我都将Ant Design 简称为 Antd

Ant Design是个服务于企业级产品的UI框架,主要可以用于中后台系统,它有基于React、Vue和Angular的实现。个人感觉Antd还是很强大的,API相当完善、全面,基本能实现你想要的各种功能。

表单
在开发普通的后台系统时,开发得最多的就是实体的 新建、编辑和详情页面,这三个页面有共通之处,也有不同之处,感觉有可以复用的地方,但是有些地方又需要特殊处理。

表单页如图:

详情页如图:

新建、编辑、详情页与Form表单组件的关系

从上面的几个图中我们看出:

  • 新建和编辑可以复用一个Form组件
  • 新建时不传给Form组件数据
  • 编辑时会请求后端实体的数据,传给Form组件,进行数据初始化
  • 详情页照理说也可以用Form组件,但是,UI视图上面Form组件和详情页面会不一致,比如:详情页只是纯粹展示的div,而非各种表单控件了。

思考并进行实现

通过上面的调研,我们可以考虑把详情页、新建和编辑做成单独的页面,但是新建和编辑复用同一个Form组件,Form组件进行数据收集、展示、表单校验,额外的逻辑处理(比如新建、编辑的提交动作、跳转页面和数据过滤)可能会有不同,所以在新建、编辑页面进行分别的处理。
ok,我们看看Form表单代码实现: 更多详情看这里

      <Form onSubmit={this.handleSubmit}><FormItem{...formItemLayout}label="E-mail">{getFieldDecorator('email', {rules: [{type: 'email', message: 'The input is not valid E-mail!',}, {required: true, message: 'Please input your E-mail!',}],})(<Input />)}</FormItem><FormItem{...formItemLayout}label="Password">{getFieldDecorator('password', {rules: [{required: true, message: 'Please input your password!',}, {validator: this.validateToNextPassword,}],})(<Input type="password" />)}</FormItem>
...

上面的代码是利用Antd表单实现的,这里会有一些问题:

  • 平均一个表单控件用平均12~17行代码(不包含复杂逻辑和回调函数),在大型系统中,一个复杂的表单可能会有30~40个控件,怎么办? 写一个2000 行的Form.js文件吗?
  • 如下写法,会出现冗余代码:

每个控件都要写

FormItem
getFieldDecorator
,会出现多次,而且格式一致

        <FormItem{...formItemLayout}label="E-mail">{getFieldDecorator('email', {rules: [{type: 'email', message: 'The input is not valid E-mail!',}, {required: true, message: 'Please input your E-mail!',}],})(<Input />)}</FormItem>
  • 详情页需要重写一套完全不一样的逻辑和UI,无法复用Form组件中的逻辑
  • 如果有动态标签怎么办? 比如我遇到一个场景:页面中有一些字段是前端写死的,比如 用户名,密码等,还有一些字段,是用户上传一个模板文件,后端解析模板并返回给前端的,结构可能是这样:
{"name":"标签名1","type":1, // 1:文本框, 2:百分比,3:数字,4:金额,5:单选按钮,6:单选下拉框,7:多选按钮,8:多选下拉框,9:日期-单日,10:日期-区间"commonUse":true, //是否常用标签"requiredTag":true, //是否必填"placeholder":"这个是描述","option":[ //选择项会用到此字段{"id":1,"name":"名字","defaultOption":true, // 是否默认选中}]
}

更好的解决方案

  • 为了避免一个Form超过1000行这种情况出现,我们应该把大型Form表单进行拆分

如下图,有个合同的Form表单,我们按照类型做如下拆分:

  • 针对上面的其余问题,我们计划提取出这样一个公共组件:
    • 组件接收:需要渲染表单的字段、初始数据、字段的控件类型等
    • 能根据字段的不同的控件类型渲染不同的表单控件
      • Select
      • Input
      • ...
    • 详情页也能复用这个组件
    • 具有可扩展性(比如Antd的API的方法在此组件中均能使用)

总结

后台系统中我们开发的大部分页面都是表单页(新建、编辑、详情),少部分是列表页,我们应该多考虑路由划分、数据层设计、业务组件拆分、公用组件设计与实现,如果这些方面做好了,积累一定的经验,以后开发后台系统一定会事半功倍。
Tip: 我准备在下期再详细讲解上面提到的表单公用组件的设计与实现。
下一期: => 基于React的表单开发的分析(下)

相关链接

https://ant.design/components/form-cn/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

50个Servlet面试问答

Servlet是Java EE的一个非常重要的主题&#xff0c;所有Web应用程序框架&#xff08;例如Spring和Struts&#xff09;都建立在它之上。 这使servlet成为Java访谈中的热门话题。 在这里&#xff0c;我提供了50个servlet面试问题的列表&#xff0c;并提供了答案&#xff0c;以帮…

在vue中使用font-awesome

1、安装 cnpm i font-awesome -S 2、在main.js中引入 import font-awesome/css/font-awesome.min.css 转载于:https://www.cnblogs.com/wuln/p/9072084.html

深入浅出的webpack4构建工具--webpack4+react构建环境(二十)

下面我们来配置下webpack4react的开发环境&#xff0c;之前都是针对webpack4vue的。下面我们也是在之前项目结构的基础之上进行配置下。 首先看下如下是我为 webpack4react 基本的项目结构如下&#xff1a; ### 目录结构如下&#xff1a; demo1 …

Webpack 4进阶--从前的日色变得慢 ,一下午只够打一次包

从前的日色变得慢&#xff0c;车&#xff0c;马&#xff0c;邮件都慢&#xff0c;一生只够爱一个人 -- 《从前慢》 近期在团队项目里把Webpack升级到4.4.1&#xff0c;过程中发现现存的升级文档十分有限&#xff0c;踩了不少坑&#xff0c;好在升级之后提升还算显著&#xff0c…

使用Guava MapSplitters配置Hadoop

在本文中&#xff0c;我们将为通过Context对象将配置参数传递给Hadoop Mapper提供新的思路。 通常&#xff0c;我们在启动map-reduce作业时将配置参数设置为Context对象上的键/值对。 然后&#xff0c;在Mapper中&#xff0c;我们使用键来检索用于我们的配置需求的值。 不同之处…

pdo 参数化查询 mysql函数_PDO笔记之参数化查询

参数化查询解释在这里&#xff1a;Wiki参数化查询 (少有的Wiki中文比英文介绍的要详细的编程条目)PDO中参数化查询主要用到prepare()方法&#xff0c;然后这个方法会返回一个PDOStatement对象&#xff0c;也就SQL声明(不知道怎么翻译)&#xff0c;此时SQL语句只是被编译&#x…

二叉树和哈希表的优缺点对比与选择

二叉树(binary tree)和哈希表(hash table)都是很基本的数据结构&#xff0c;但是我们要怎么从两者之间进行选择呢&#xff1f;他们的不同是什么&#xff1f;优缺点分别是什么&#xff1f; 回答这个问题不是一两句话可以说清楚的&#xff0c;原因是在不同的情况下&#xff0c;选…

编码Java时的10个微妙的最佳实践

这是10个最佳实践的列表&#xff0c;这些最佳实践比您的平均Josh Bloch有效Java规则要微妙得多。 尽管Josh Bloch的列表很容易学习&#xff0c;并且涉及日常情况&#xff0c;但此处的列表包含了涉及API / SPI设计的较不常见的情况&#xff0c;但可能会产生很大的影响。 我在编…

Vue 实现微信 jssdk 扫码, 上传图片

流程 1: 配置微信公众号JS域名 2:前端发送URL后台获取JSSDK配置, 后台Service代码如下, 修改2处位置: WeixinUtil.APPID > 当前公众号APPID WeixinUtil.getAccessToken() > 当前公众号access_token public interface IWxJssdkService {Map<String, Object> getJssd…

有意思的前端函数面试题

1:考引用类型在比较运算符时候 隐式转换会调用本类型那个方法 toString和valueOf&#xff1f;(去年过年吵的很火国外的题) if(a 1 && a 2 && a 3){console.log("我走进来了"); }<!--答案1:--> var a {num:0}; a.valueOf function(){retur…

用java写个简单的直播强求_全网最简单易懂的Netty入门示例,再不会用Netty我直播吃翔...

//server引导类ServerBootstrap serverBootstrap new ServerBootstrap();//boss 对应 IOServer.java 中的接受新连接线程,主要负责创建新连接NioEventLoopGroup boss new NioEventLoopGroup();//worker 对应 IOServer.java 中的负责读取数据的线程,主要用于读取数据以及业务逻…

XamarinAndroid组件教程设置自定义子元素动画(一)

XamarinAndroid组件教程设置自定义子元素动画(一) 如果在RecyclerViewAnimators.Animators中没有所需要的动画效果&#xff0c;就可以自定义一个。此时&#xff0c;需要让自定义的动画继承BaseItemAnimator抽象类。 【示例1-2】下面以RecylerViewAnimatorsItemAnimator项目为基…

使用Storm进行可扩展的实时状态更新

在本文中&#xff0c;我将说明如何借助Storm框架以可扩展且无锁定的方式在数据库中维护实时事件驱动流程的当前状态。 Storm是基于事件的数据处理引擎。 它的模型依赖于基本原语&#xff0c;例如事件转换&#xff0c;过滤&#xff0c;聚合……&#xff0c;我们将它们组合成拓扑…

python关于字典嵌套字典,列表嵌套字典根据值进行排序

python 对于字典嵌套字典&#xff0c; 列表嵌套字典排序 例&#xff1a;列表嵌套自字典&#xff1a;d [{"name": 张三, s: 68}, {name: 李四, s: 97}] 对于列表嵌套字典可以使用python的sorted()方法&#xff0c;也可以使用list的sort()方法&#xff1a; sorted方法…

【干货】十分钟读懂浏览器渲染流程

在之前写过的一篇《"天龙八步"细说浏览器输入URL后发生了什么》一文中&#xff0c;和大家分享了从在浏览器中输入网址URL到最终页面展示的整个过程。部分读者向我反馈对于最后的浏览器渲染布局这块不是很清晰&#xff0c;所以本文就浏览器渲染流程单独开篇讲解&#…

控制台资费管理主菜单java_java毕业设计_springboot框架的高速公路收费管理系统...

今天介绍一个java毕设题目, 题目内容为springboot框架的高速公路收费管理系统, 是一个采用b/s结构的javaweb项目, 采用java语言编写开发工具eclipse, 项目框架jspspringbootmybatis, 高速公路收费管理系统的信息存储于mysql中, 并基于mybatis进行了orm封装, 该高速公路收费管理…

Hibernate框架的搭建和一个简单的实例

Hibernate是一个支持对JDBC进行封装的框架&#xff0c;实现了对底层数据库访问的封装。非常适合使用和开发。首先需要下载Hibernate&#xff0c;可以在这个网站下载最新包。http://www.hibernate.org/然后打开他的目录结构&#xff0c;将lib目录下的required目录下的包全部导入…

在Amazon EMR上运行Hadoop MapReduce作业

不久前&#xff0c;我发布了如何使用CLI设置EMR群集的信息。 在本文中&#xff0c;我将展示如何使用适用于AWS的Java SDK来设置集群。 展示如何使用Java AWS开发工具包执行此操作的最佳方法是展示完整的示例&#xff0c;因此&#xff0c;让我们开始吧。 设置一个新的Maven项目…

在商城系统开发时遇到商品的多级分类,为增强扩展性,子类可以任意添加,此类问题数据库如何设计...

表结构为&#xff1a; id&#xff08;编号&#xff09; name&#xff08;分类名&#xff09; parentID&#xff08;父类编号&#xff09; 简单举例如下&#xff1a; id name parentID 1 饮料 0&#xff08;为0表示第一大类&#xff09; 2 水果 …

[JSConf EU 2018] 大脑控制 Javascript

先解释&#xff0c;本人为前端菜鸟&#xff0c;之前也未参加过类似的活动&#xff0c;没有翻译过什么文章&#xff0c;此次是好奇心使然&#xff0c;也是想尝试下&#xff0c;学习学习&#xff0c;英文很烂&#xff0c;全靠有道&#xff0c;但是视频整个看下来&#xff0c;还是…