做单页应用,不管是用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,而是需要通知父组件重新请求数据,以达到恢复默认数据的目的

 

  

最新文章

  1. C# 动态修改Config
  2. POI导出Excel并下载
  3. 说说APP接口中的版本控制
  4. ASP.NET MVC自定义验证Authorize Attribute
  5. jprofiler_监控远程linux服务器的JVM进程(实践)
  6. JavaScript基础插曲---apply,call和URL编码等方法
  7. java基础类和对象-题
  8. discuz门户首页-header文件模板语法详解和注释
  9. mybatis 中#{}与${}的区别 (面试题)
  10. Jordan Lecture Note-12: Kernel典型相关分析(Kernel Canonical Correlation Analysis, KCCA).
  11. SQLite入门与分析(二)---设计与概念(续)
  12. java对象数组的概述和使用
  13. windows服务(Windows Installer问题,错误5:拒绝访问)
  14. IOS开发之——获取屏幕的尺寸及各模拟器代表的型号
  15. 控制执行流程——(Java学习笔记三)
  16. 小蚂蚁搬家<贪心>
  17. 用于Mysql操作的MySqlHelper类
  18. JQuery 常用的那些东西
  19. 关于.Net mvc 项目在本地vs运行响应时间过长无法访问时,解决方法!
  20. Ext.isEmpty()的使用

热门文章

  1. k8s Ipvs 内部网络自动分配和内部网络一致ip地址,导致ip冲突
  2. Python generator 类型
  3. PostgreSQL SELECT INTO和INSERT INTO SELECT 两种表复制语句
  4. centos7 设置 防火墙 开机自启
  5. Java同步数据结构之ConcurrentLinkedQueue
  6. CentOS源码安装 Tomcat/8.0.24
  7. Build Telemetry for Distributed Services之OpenCensus:C#
  8. JMeter 不同线程组间变量传递(亲测 ok)
  9. nginx反向代理本地 两台web负载均衡 使用ip+端口代理
  10. Golang sync.WaitGroup的用法