• 【前端笔记】Ant Design Form组件 resetFields() 与 setFieldsValue() 之比较


    Ant Design Form组件 resetFields() 与 setFieldsValue() 之比较

    关键词:React,Ant Design,Form组件,组件渲染

    一、问题描述

    Form 表单中有一个自定义的子组件,当From表单在关闭、重置或取消时候,子组件都会重新渲染,会重新向后端二次请求数据,影响服务性能。
    在这里插入图片描述

    二、问题分析

    一开始,我以为是子组件的propsstate改变了,导致的重新渲染,但是我没有传入任何props的情况下,这种事情还是会发生。

    然后,尝试了一堆useMemo()React.memo() 之类的方法,依然无果!

    最后,使出杀手锏,控制变量法,一行行代码分析。终于定位到了问题原因,是form.resetFileds() 这个函数除了问题。

    三、问题原因

    官方解释:为什么 resetFields 会重新 mount 组件?

    resetFields 会重置整个 Field,因而其子组件也会重新 mount 从而消除自定义组件可能存在的副作用(例如异步数据、状态等等)。

    通过对比setFiledsValueresetFileds 两者的源码,我发现区别如下:
    在这里插入图片描述
    在这里插入图片描述
    notifyObservers()中,两者传入的type类型不同,这最终都会执行到onStoreChange()方法中。
    在这里插入图片描述
    onStoreChange()方法中,set 和 reset 的区别就在于执行的是 refresh() 还是 reRender()
    在这里插入图片描述
    在这里插入图片描述refresh()方法中,有个计数器状态,每次都会自增1,
    在这里插入图片描述
    而这个计数器是放在每个Filed渲染的时候就使用了。
    在这里插入图片描述
    所以,结论已经很明显了。

    1. filed 渲染生成一个计数器;
    2. resetFileds() 方法会更新这个计数器;
    3. 计数器更新,导致子组件重新渲染。

    四、总结

    • setFiledsValue():设置表单的值(该值将直接传入 form store 中。如果你不希望传入对象被修改,请克隆后传入),组件不会重新渲染。
    • resetFileds():重置一组字段到 initialValues,组件会重新渲染。
  • 相关阅读:
    Linux学习笔记——系统函数IO
    SSM框架-获取容器的方式
    SQL高级用法
    LVGL---windows PC模拟器(codeblocks)运行LVGL
    3D图像与表格的结合MICCAI2021
    清水混毒【逻辑题】
    Linux---cpu和核心数目查看
    【无标题】
    代码随想录算法训练营第1天 | 704.二分查找、27.去除元素
    ps抠图怎么抠出来,自学ps软件photoshop2022,ps怎么抠出想要的部分-笔记记录
  • 原文地址:https://blog.csdn.net/u011718737/article/details/125513967