背景众所周知,AntD最近推出了4.0,更新了很多新特性。我很高兴看到它。更贴心的是,它还提供了升级工具。看了一些文章说可以三分钟升级。于是周六,我也没有睡太晚,就去公司开始了升级之旅。注:本文只是我在升级过程中遇到的部分问题。不具有代表性,仅供参考。正文首发于这篇文章:很多公众号也转发了这篇文章,文笔很吸引人,我也想体验一下。上街第一步:antd4-codemod看官方介绍:我是乌龟,太牛了!!一键转开心~马上安??排!于是我输入了第一行命令:sudonpmi-g@ant-design/codemod-v4全局安装了这个代码转换工具,很顺利。第一步上街:antd4-codemod运行antd4-codemodsrcconsole:任务完成前报错。.问题不大,我们老实人不怕这个。如果缺少core-js,请安装一个。安装后,还是一样的错误。..一番查找后,在一篇不起眼的文章中找到了答案:全局安装,果不其然,没有报错,找不到core-js,问题解决。(中间又弹出了其他的错误,花了很多时间,但是都一一解决了。)直到弹出一个新的错误:我找到了一些答案:按照文章中的提示,逐一修改一、等待安装。运行一下,还是不行。..神色渐渐凝固。此时已经是六七点钟了。向外望去,天已经黑了。这第一步还没迈出,我就开始烦躁了。我是谁,我在哪里,我为什么要用这个antd4-codemod……冷静点,打农药单机输了。然后开始一个一个手动改文件。飘街第二步:ForminitialValues我觉得今天起码得换个页面看看。随便挑了一个简单的,一个Form表单页面。Formv3&v4移除了Form.createv4的Form不再需要通过Form.create()创建上下文。Form组件现在有了自己的数据字段,所以不再需要getFieldDecorator,直接写Form.Item即可://antdv3constDemo=({form:{getFieldDecorator}})=>(
{getFieldDecorator('username',{rules:[{required:true}],})()});constWrappedDemo=Form.create()(Demo);改为://antdv4constDemo=()=>(
形式>);由于去掉了Form.create(),将原来的onFieldsChange等方法移到了Form中,通过fields来控制Form。表单控件调整Form有自己的表单控件实体。如果需要调用form方法,可以通过Form.useForm()创建一个Form实体://antdv3constDemo=({form:{setFieldsValue}})=>{React.useEffect(()=>{setFieldsValue({用户名:'竹子',});},[]);return({getFieldDecorator('username',{rules:[{required:true}],})()});};constWrappedDemo=Form.create()(Demo);改为://antdv4constDemo=()=>{const[form]=Form.useForm();React.useEffect(()=>{form.setFieldsValue({username:'Bamboo',});},[]);return();};有一个很简单的列表页,包含一个Form,点击按钮可以查看数据。code打开链接:https://codepen.io/scaukk/pen...提了一个issue:https://github.com/ant-design...这个问题,有热心网友说:每次加个效果都是modal中显示Reset,每次确认这个resetFields都会重置为initialValue的值,重置的值其实是上次的,所以不会向右变化。回复:resetFields是重置回initialValues值,initialValues只用于第一次初始化,不响应后续变化。你需要换个思路:https://codepen.io/afc163-147...在官网上,我也找到了这样的描述:在v3版本中,修改未操作的字段initialValue会同步更新字段值,这是一个BUG。但是因为它已经作为一个特性使用了很长时间,所以我们没有修复它。在v4中,此错误已得到修复。initialValue仅在初始化和重置表单时生效。所以initialValue只能在组件第一次挂载时生效。正确做法与文档推荐一致:render:(text,record)=>({setVisible(true)setRecord(record)form.setFieldsValue({name:record.name,});}}>View),但是这样手动设置FieldsValue比较麻烦。想了想,我又用了另一种方法来解决这个问题。新方法:单独提取Modal,并在此处销毁表单:const[form]=Form.useForm();随着组件的销毁,每次都是新的,这是一个完美的解决方案。LiveDemo:https://codepen.io/scaukk/pen...至此,第一页已经修改完毕。结束后还有很多页面需要修改,我觉得还是值得的。以后会持续更新,希望大家能避开这几点。希望这篇文章对大家有所帮助。最后,如果觉得内容有帮助,可以关注我的公众号《前端e进阶》,一起学习,一起钓鱼。参考文章:https://ant.design/components...https://zhuanlan.zhihu.com/p/...