做单页应用,不管是用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. elasticsearch head插件(5.0及以上版本)

    官方参考地址:https://github.com/mobz/elasticsearch-head5.0及以上版本安装参考地址:http://www.cnblogs.com/jstarseven/p/ ...

  2. nginx配置不当引起的错误

    1.CRLF注入 1.1环境配置 apt install nginx vi /etc/nginx/sites-available/default location / { return 302 htt ...

  3. Java-ZipUtil

    Zip 压缩工具类,不支持压缩空文件夹. 简单版 import java.io.FileOutputStream; import java.io.IOException; import java.ni ...

  4. maven打包遇到错误,Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test

    对Pom文件进行配置(亲自尝试,已成功解决) <build> <plugins> <plugin> <groupId>org.apache.maven. ...

  5. PyTorch Tutorials 1 PyTorch是什么?

    %matplotlib inline PyTorch是什么? 基于Python的科学计算包,服务于以下两种场景: 作为NumPy的替代品,可以使用GPU的强大计算能力 提供最大的灵活性和高速的深度学习 ...

  6. 免费的HTML5版uploadify

    转http://www.cnblogs.com/lvdabao/p/3452858.html var defaults = { fileTypeExts:'',//允许上传的文件类型,格式'*.jpg ...

  7. Windows10 64位 安装 Docker

    本文主要介绍Docker在Windows下的安装.关于Docker的介绍和文档在其官网中可以找到:http://www.docker.com .安装环境:Windows10 64位. Docker引擎 ...

  8. 灵活配置tomcat根目录网站

    <Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...

  9. VS自定义代码块Code Snippet

    一  .简述 我们在开发当中,避免不了一些重复的开发工作,在你漫长的开发以及学习当中,你会发现有这么一部分代码是你时常会使用到的.我想这个工具也是针对这个原因出来的吧,它就是预先把你需要的这部分代码的 ...

  10. STM32第二章I/O端口应用

    STM32F10xxx系列中,有7个I/O端口,每个端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位 ...