Ant Disign 4.0 升级实践扑街指南 (一)

image.png

背景

咱们都知道, AntD 最近喜提了4.0, 更新了许多新特性,看的我是心花盛开, 喜不自胜。 更贴心的是还提供了升级工具,看了一些文章介绍说能三分钟升级。 因而周六的时候, 懒觉我也不睡了, 跑到公司开始了升级之旅。前端

注:此篇文章仅是我我的升级的时候遇到的一些问题,不具表明性,仅供参考git

正文

首先是从这篇文章开始的:github

https://zhuanlan.zhihu.com/p/109067115

不少公众号也转发了这篇文章, 写的很吸引人, 我也想体验一下。npm

扑街第一步: antd4-codemod

看官方介绍:
codemod runningsegmentfault

我滴龟龟, 也太好了吧!! 一键转换美滋滋~antd

立刻安排!app

因而我敲下了第一行命令:工具

sudo npm i -g @ant-design/codemod-v4

全局安装了这个代码转换工具, 很顺利。学习

扑街第一步:antd4-codemod

运行 antd4-codemod src

控制台:ui

image.png

image.png

出师未捷先报错。。

问题不大, 咱们老实人不怕这个。

缺乏core-js, 那就装一个。

安装以后, 仍是一样的报错。。。

image.png

一番搜索以后, 在一个不起眼的文章里找到了答案:

image.png

全局安装, 果真不报错core-js找不到了, 问题解决。

(中间也爆了其余的错, 花了很多时间,不过都一一解决了。)

直到又爆了新的错误:

image.png

搜索到一些答案:

image.png

image.png

按照文章中的提示,逐个修改,等待安装。

运行一下, 仍是不行。。。

表情逐渐凝固。

image.png

这时候已经六七点了,看看外面, 天都黑了。

这第一步还没迈出去, 开始暴躁。

我是谁, 我在哪,我为何要用这个 antd4-codemod...

冷静一下, 打了局农药单排,输了。

而后开始手动一个个改文件。

扑街第二步: Form initialValues

想着今天必定, 至少, 得改完一个页面看看。

就挑了个简单的, 一个Form表单页。

Form v3 & v4

去除 Form.create

v4 的 Form 再也不须要经过 Form.create() 建立上下文。Form 组件如今自带数据域,于是 getFieldDecorator 也再也不须要,直接写入 Form.Item 便可:

// antd v3
const Demo = ({ form: { getFieldDecorator } }) => (
  <Form>
    <Form.Item>
      {getFieldDecorator('username', {
        rules: [{ required: true }],
      })(<Input />)}
    </Form.Item>
  </Form>
);

const WrappedDemo = Form.create()(Demo);

改为:

// antd v4
const Demo = () => (
  <Form>
    <Form.Item name="username" rules={[{ required: true }]}>
      <Input />
    </Form.Item>
  </Form>
);

因为移除了 Form.create(),本来的 onFieldsChange 等方法移入 Form 中,经过 fields 对 Form 进行控制。

表单控制调整

Form 自带表单控制实体,如须要调用 form 方法,能够经过 Form.useForm() 建立 Form 实体进行操做:

// antd v3
const Demo = ({ form: { setFieldsValue } }) => {
  React.useEffect(() => {
    setFieldsValue({
      username: 'Bamboo',
    });
  }, []);

  return (
    <Form>
      <Form.Item>
        {getFieldDecorator('username', {
          rules: [{ required: true }],
        })(<Input />)}
      </Form.Item>
    </Form>
  );
};

const WrappedDemo = Form.create()(Demo);

改为:

// antd v4
const Demo = () => {
  const [form] = Form.useForm();

  React.useEffect(() => {
    form.setFieldsValue({
      username: 'Bamboo',
    });
  }, []);

  return (
    <Form form={form}>
      <Form.Item name="username" rules={[{ required: true }]}>
        <Input />
      </Form.Item>
    </Form>
  );
};

有个很简单列表页里包含一个Form,点击按钮,查看数据。

Kapture 2020-03-02 at 21 01 50

codeOpen连接:
https://codepen.io/scaukk/pen...

提了个issue:
https://github.com/ant-design...

这个问题,一个热心网友说:

加一个effect 每次显示modal的时候重置, 这个resetFields重置的每次都是initialValue的值 你每次肯定的时候重置的值其实都是上一次的, 因此不会变

偏右的回复:

resetFields 是重置回 initialValues 的值,而且 initialValues 只用于第一次初始化,不响应后续的变化,你须要转换一下思路: https://codepen.io/afc163-147...

在官网中, 也找到了这样的描述:

image.png

在 v3 版本中,修改未操做的字段 initialValue 会同步更新字段值,这是一个 BUG。可是因为被长期做为一个 feature 使用,于是咱们一直没有修复。在 v4 中,该 BUG 已被修复。initialValue 只有在初始化以及重置表单时生效。

因此, initialValue 只能做为组件初次挂载的时候生效。

偏右的作法和文档推荐的一致:

render: (text, record) => (
  <span onClick={() => {
    setVisible(true)
    setRecord(record)
    form.setFieldsValue({
      name: record.name,
    });
  }}>
    <a>查看</a>
  </span>
),

image.png

不过这样子手动setFieldsValue比较麻烦, 我想了一下一下以后, 用了另外一种方法是来解决这个问题。

新的办法:

把 Modal 单独抽出来, 把这里的form:

const [form] = Form.useForm();

随着组件的销毁一块儿销毁, 这样每次就都是新的了, 完美解决。

Live Demo:

https://codepen.io/scaukk/pen...

Kapture 2020-03-03 at 15.42.12.gif

至此, 第一个页面就改完了。

image.png

结尾

后面还有好多个页面须要改, 我认为这是值得的。

以后还会持续更新, 但愿你们都能避开这些点。

但愿本文对你们有所帮助。

最后

若是以为内容有帮助,能够关注下个人公众号 「 前端e进阶 」,一块儿学习,一块儿摸鱼。

clipboard.png

参考文章:

https://ant.design/components...

https://zhuanlan.zhihu.com/p/...

相关文章
相关标签/搜索