做单页应用,不管是用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. 数据库groub by分组后,把多行数据合并成一行数据(Oracle、Postgres)

    关键字 row_number() over (partition by)   例如,下面的数据, 这是按照name分组后,展示property值. 我们想得到这样的值; 第一步:将每一组的proper ...

  2. 区间dp括号匹配

    POJ2955 匹配则加一,不需要初始化 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> ...

  3. spring配置hibernate在使用oracle驱动时报错Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver '

    在看到这个错误的时候就感觉有点不对劲了,在错误的结尾和引号之间还有空间,如果敏锐的点应该察觉到可能是空格问题.由于本人的粗心导致这个问题一直困扰了我接近一个上午. 在排查这个问题的时候首先想到的就是关 ...

  4. benchmark在postgresql上的安装及使用

     BenchmarkSQL是一款经典的开源数据库测试工具,内嵌了TPCC测试脚本,可以对EnterpriseDB.PostgreSQL.MySQL.Oracle以及SQL Server等数据库直接进行 ...

  5. 例子:Vue 配合 vue-resource 从接口获取数据

    vue-resource 是 vue 的一个与服务器端通信的 HTTP 插件,用来从服务器端请求数据. 结合例子——图片列表来写一下 Vue获取接口数据. html : <div id=&quo ...

  6. android: Android 权限管理小结

    一. 概述 感谢郭神,自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有 ...

  7. <JavaScript>谈谈javascript语法里一些难点问题(一)

    1)    引子 前不久我建立的技术群里一位MM问了一个这样的问题,她贴出的代码如下所示: var a = 1; function hehe() { window.alert(a); var a = ...

  8. Eclipse的下载地址

    下载地址:http://eclipse.org/

  9. C++ STL partial_sort_copy

    #include <iostream>#include <deque>#include <algorithm>#include <vector> usi ...

  10. c++ new bad_alloc

    try { for (int i = 0; i<1000; i++) { test1 = new Test(); cout << i << " new dog ...