做单页应用,不管是用Vue还是React,或者其他,有一个重要的原则,就是:组件重用。

  既然组件可以重用,那么当添加一个信息,和修改该信息的布局必然是一致的,这时候,最好的方法自然是利用同一个组件,在添加信息的时候,默认值为空,在修改的时候,默认值为后台获取到的数据。

  看一个基础页面:

  

  这是一个添加企业信息的页面,这里利用antd的form绘制了一个基础组件。到后来,需要修改企业信息的时候,发现布局部分完全一样,那么必然是继续利用该组件,只是此时需要传递props过来,以使得组件能够自动添加默认数据。

  平常,当props变化,我们重新组织页面数据时候,经常使用的是componentWillReceiveProps这一生命周期函数,在其内部,进行数据的组织。

  那么根据经验,此时,我们在获取到props值之后,进行数据填充。 

componentWillReceiveProps(nextProps){
...// 代码省略
this.props.form.setFieldsValue(setFieldsValue.data)
}

  可是,当我们回过头看一下antd的文档的时候,会发现一个令人崩溃的事实。

  会导致死循环,这就尴尬了,那么怎么解决初始值呢?

  继续查看文档:

  

  这不就是正好是我们当前出现困局的原因么!数据存在上层组件,需要传递过来,那么下面的事情就是怎么使用mapPropsToFields的问题了。继续看文档,发现mapPropsToFields居然是Form.create(options)中options的配置项。那不就得了,配呗!可是我们是不是有一个疑惑,配完之后,怎么应用到组件当中呢?

  尴尬的是,无论如何我们都没有再文档中看到怎么应用到组件当中。只有一个简单的示例:

mapPropsToFields(props) {
return {
username: Form.createFormField({
...props.username,
value: props.username.value,
}),
};
}

  如果不仔细去扒拉扒拉的话,跟本不明白这个示例是个什么意思。

  通过多次试验,发现mapPropsToFields的返回对象的key值,其实就是我们在组件当中利用getFieldDecorator设置的关键字,只要配置正确,不需要额外的应用,配置完,antd会帮我们应用到组件当中。那我们就写一个具体的例子。

export default Form.create({
mapPropsToFields (props) {
... //省略代码
return props.auth ? {
ownerNature: Form.createFormField({
value: props.auth.ownerNature
}),
ownerName: Form.createFormField({
value: props.auth.ownerName
}),
cidNumber: Form.createFormField({
value: props.auth.cidNumber
}),
registeredCapital: Form.createFormField({
value: props.auth.registeredCapital
})
} : {}
}
})(componentName)

  这里多一步三目运算是因为当我们在添加企业信息的时候,是没有初始值的,如果不返回空对象的话,组件内部就报错了。这里的‘ownerNature’, 'ownerName', 'cidNumber', 'registeredCapital',甚至更多,都是在render函数里面,通过getFieldDecorator定义的,必须value关键词存储其真实的数据。

  至此,该Form表单算是可以真正的重用了。说实话,相比较而言,这里似乎比起Vue的v-model设计的数据双向绑定复杂多了。

  但是,这时候,如果页面上有重置按钮的话,那么还得注意,当修改信息的时候,不是直接resetFieldsValue,而是需要通知父组件重新请求数据,以达到恢复默认数据的目的

 

  

antd做form表单的组件共用,利用mapPropsToFields填写默认值的更多相关文章

  1. django做form表单的数据验证

    我们之前写的代码都没有对前端input框输入的数据做验证,我们今天来看下,如果做form表单的数据的验证 在views文件做验证 首先用文字描述一下流程 1.在views文件中导入forms模块 2. ...

  2. Form表单验证组件

    Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...

  3. 【antd】form表单默认值设置

    问题: 在antd的form表单的api里面有个"initialValues"可以设置默认值.但是表单没有更新 <Form name="test" for ...

  4. form表单提交,后台怎么获取select的值?后台直接获取即可,和input方式一样。

    form表单提交,后台怎么获取select的值? 后台直接获取即可,和后台获取input的值方式一样. form提交后,后台直接根据select的name获取即可,即getPara("XXX ...

  5. 封装react antd的form表单组件

    form表单在我们日常的开发过程中被使用到的概率还是很大的,比如包含了登录.注册.修改个人信息.新增修改业务数据等的公司内部管理系统.而在使用时这些表单的样式如高度.上下边距.边框.圆角.阴影.高亮等 ...

  6. react引用antd的form表单

    引用form是第三方插件ant插件,官网网址:https://ant.design/.用到的antd的版本是@2.0.1.form(https://ant.design/components/form ...

  7. form表单提交的时候,传过去的值是键值对的形式

    效果展示 第一种需求,点击input的时候,input的value发生改变 $('.group-wrapper input').click(function(){ $(this).val(0); // ...

  8. iview中Modal弹窗做form表单验证相关问题

    在modal中初始化状态,点击确定弹窗消失. 有的时候表单验证就不希望立刻消失 在iview官网中有自定义页头页脚 可以直接自定义使用 另一种验证写法 serform: { ctCatelogue: ...

  9. 点击文字弹出一个DIV层窗口代码 【或FORM表单 并且获取点击按钮的ID值】

    点击不同按钮咨询不同的 专家 <?php for($i=1;$i<5;$i++){ $uid=$i; //用户ID ?> <a class="a_click" ...

随机推荐

  1. redis数据结构有哪些

    1.String 可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作. 2.list 一个链表, ...

  2. elasticsearch java client

    1.集群名相同,且机器处于同一局域网同一网段,es会自动去发现其他的节点.2.集群不在同一局域网同一网段时,只需要在 elasticsearch.yml 中配置目标机器和端口即可discovery.z ...

  3. Linux 之Shell for循环

    @代表所有参数所以如果后面跟上echo $v你会发现他会一次显示user userdebug eng $poo -le ${#prodlist[@]} 这句话是说 $poo小于等于prodlist中的 ...

  4. 如何修改layer-layui中的confirm

    需求: 改成 背景: 这个confirm是layui中的layer弹出框,要想修改这个弹出框的内容岂不是要去修改源码?当我在源码里扒拉半天梳理好了逻辑之后,突然意识到,其实我本可以不必这么麻烦的,直接 ...

  5. 【NetDevops】网络自动化运维--1获取用户基本信息

     版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.  之前博客的云主机到期了没续费,被删啦最重要的是没有备份!此处省略几个字.....      ...

  6. Jenkins 自动化部署上线

    转载于互联网 jenkins自动化部署项目,通过jenkins 部署来节省运维时间,不需要手动cp上线及版本发布 Jenkins 自动化部署上线 Jenkins Jenkins 自动化部署上线一.Je ...

  7. jack语言编译器的实现过程

    目录: 1, 背景介绍

  8. JAVA 基础编程练习题47 【程序 47 打印星号】

    47 [程序 47 打印星号] 题目:读取 7 个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*. package cskaoyan; public class cskaoyan47 { ...

  9. [译] NAT - 网络地址转换(2016)

    [译] NAT - 网络地址转换(2016) Published at 2019-02-17 | Last Update 译者序 本文翻译自 2016 年的一篇英文博客 NAT - Network A ...

  10. 【leetcode_easy】557. Reverse Words in a String III

    problem 557. Reverse Words in a String III solution1:字符流处理类istringstream. class Solution { public: s ...