Antd 3 To 4 升级排雷

您所在的位置:网站首页 3650m5主板V3升级V4 Antd 3 To 4 升级排雷

Antd 3 To 4 升级排雷

2024-04-20 01:07| 来源: 网络整理| 查看: 265

从 v3 到 v4

随着 react 改版, antd4 升级,对3版本的写法有着非常大的更改。在项目后续开发中,如果不尽快做 antd4 的升级处理,后期维护和新开发组件的成本会极大提升。因此,决定迅速解决过去写法的问题,将 antd4 快准狠的升级完毕。

准备工作

这一步可以不做

Npm install 初始化项目 Npm upgrade [email protected] --更新 antd包到3版的终极版本 Npm run start --跑一下项目,观察是否有问题 升级 antd4 # 通过 npx 直接运行 npm i -g @ant-design/codemod-v4 # 或者全局安装 # 使用 npm npm i -g @ant-design/codemod-v4 # 或者使用 yarn yarn global add @ant-design/codemod-v4 # 运行 antd4-codemod src 解决问题 将 antd4 自动化脚本运行完成后,会有提示告知是否需要手动修改 转换需要依赖 @ant-design/icons 和 @ant-design/compatible Ant-design 的组件需要依赖 react 和 react-dom 16.9.0 以上,所以要升级 react 和 react-dom 最后升级 antd 版本 npm install [email protected] # 根据提示安装 @ant-design/icons 和 @ant-design/compatible 对应版本 npm install @ant-design/icons npm install @ant-design/compatible npm install [email protected]

或者可以通过修改 package.json 的方式,重新初始化 node_modules 包

运行项目

运行项目会出现的样式问题,存在问题的例子

image.png

这是因为 ant-design 的css 没有包含在 loader 的文件里,通过将@ant-design 添加到 include 里解决

2.Input 样式调整,之前的样式在 .ant-input 可以包括整个 input 组件, 升级后 .ant-input 是不包含搜索icon 的,所以将原来的样式调整到 .ant-input-affix-wrapper

3.Antd 默认背景颜色从透明修改为白色了,并且table的层级去掉 .ant-table-body 并且添加了 .ant-table-container

4.Table 的 dataIndex 写法更改

data.name v3.0 => ['data', 'name']

data[0].name v4.0 => ['data', 0, 'name']

5.select 等组件都使用了虚拟渲染技术,通过 virtual 配合 listHeight 来控制,但是 4.0 版本并不友好,会出现滑动卡顿的现象,升级到最新版本可以有效改善。

6.useEffect 或者 useMemo 中如果依赖了空数组或者空对象,会不断触发页面刷新导致内存泄漏页面卡死,解决办法是重新定义了一个依赖变量,如果是空对象或者数组,将其定义为 undefined

7.针对Form表单:Form.create()动态创建表单形式被移除,antd4中表单的创建form.create()全部被收纳到Form.Item中,在运行antd4-codemod src后,Form表单的来源被切换到了@ant-design/compatible中来兼容antd3的模式

8.升级antd4后Typescript类型问题解决, 例如select组件的mode类型在antd4中只有 "multiple"和“tags”两种类型,需要替换所有相关的ts类型

9.Table不触发render的问题,antd4 Table对渲染条件进行了优化,对props进行“浅比较”,如果没有变化回不触发render。

- dataSource.push(newData); - this.setState({ dataSource }) // 对dataSource进行重新赋值 + this.setState({ + dataSource: { ...dataSource, newData } + })

10.antd4中的table数据行在每次更新数据时并不能进行table的rerender,此原因和4中类似,此时需要给table指定rowKey,并在每次更新每行数据时更新当前行的rowKey值。

// 更新数据: const newData = { ...data, __key: item.key + Date.now() }; // table表格 record.__key} ... /> Antd Typescript问题 Form相关类型 可能引用路径是antd3,需要手动修改成antd4兼容版本路径


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3