【react】记录一次react组件props依赖异步数据(setFieldsValue)后传递form给子组件,再逐层传递给孙子组件引起的未渲染异常

背景

react祖父组件设置异步数据(setFieldsValue)后传递form给子组件,再逐层传递给孙子组件引起的未渲染异常,孙子组件如果不设置useEffect和useState去监听value的值进行重渲染,会出现获取得到value最新值,但是不进行渲染的异常

解决前后的代码对比

完整代码(异常):
const GetText = (props) => {const { value, config, containerId, getFieldValue } = props;const [itemValue, setItemValue] = useState(value);const { formId } = config;const getFormId = useCallback((suffix = '_param_countryPhoneCode') => {if (Array.isArray(formId)) {return [containerId, formId[0], `${formId[1]}${suffix}`];}return `${formId}${suffix}`;},[formId, containerId],);useEffect(() => {const pObj = getFieldValue(getFormId()) || {};if (!value.includes('+')) {const _itemValue = `${pObj.countryPhoneCode ? '+' : ''}${pObj.countryPhoneCode} ${value}`;setItemValue(_itemValue);}}, [getFieldValue, getFormId, value, getFieldValue(getFormId())]);return itemValue ? (<><div style={{ fontSize: 12 }}>{itemValue}</div></>) : null;
};
完整代码(正常):
const GetText = (props) => {const { value, config, containerId, getFieldValue } = props;const [itemValue, setItemValue] = useState();const { formId } = config;const getFormId = useCallback((suffix = '_param_countryPhoneCode') => {if (Array.isArray(formId)) {return [containerId, formId[0], `${formId[1]}${suffix}`];}return `${formId}${suffix}`;},[formId, containerId],);// 注意,由于在changeRecordModal中有对变更记录表单项做了顺序标记,// 因此formId会多一个序号,在变更记录弹窗里,首次加载可能因为更新是异步的导致value没有正常渲染,// 所以这边必须借用useEffect和useState控制value的更新渲染useEffect(() => {const pObj = getFieldValue(getFormId()) || {};if (!value.includes('+')) {const _itemValue = `${pObj.countryPhoneCode ? '+' : ''}${pObj.countryPhoneCode} ${value}`;setItemValue(_itemValue);}}, [getFieldValue, getFormId, itemValue, value]);return itemValue ? (<><div style={{ fontSize: 12 }}>{itemValue}</div></>) : null;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/627794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JVM】类的生命周期

目录 类的生命周期 加载阶段 连接阶段 初始化阶段 类的使用阶段 类的加载阶段 类的生命周期 加载阶段 在加载阶段&#xff0c;类加载器首先会通过一个类的全限定名来获取定义此类的二进制字节流。这个步骤主要是将整个Class 文件解析成二进制流。 &#xff08;全限定名是…

海外代理IP怎么用?常见使用问题及解决方案

海外代理IP是指提供全球范围内的代理服务器&#xff0c;代理服务器充当IP与目标网站之间的中介&#xff0c;可以起到安全匿名、提高网速、突破网络壁垒的作用。在使用代理IP的过程中&#xff0c;用户可能会遇到各种挑战&#xff0c;如连接问题、速度慢等。理解这些问题的原因并…

HCIP第一次练习 -- RIP复习实验

要求&#xff1a; 需求:R1-R2-R3-R4-R5运行RIPV2 R6-R7运行RIPV1 1.使用合理地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回172.16.1.1/24172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条自数量,增加路由传递安全性 5.R5创建一个环回模拟运营商,不…

申泰勇教练的独家人物化身系列即将登陆 The Sandbox

申泰勇&#xff08;Shin Tae-yong&#xff09;教练是足球界的传奇人物&#xff0c;他来到 The Sandbox&#xff0c;推出了自己的专属人物化身系列。作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练&#xff0c;他的传奇经历现在已经影响到了虚拟世界。 向过去、现在和未…

在Dynamics 365中通过代码为用户添加角色

作为一个Dynamics 365开发者&#xff0c;你可能会遇到这样的需求&#xff1a;通过代码为用户分配角色。这个任务的实现方式可能并不明显&#xff0c;因为你不能直接创建systemuserroles实体。但别担心&#xff0c;我将在这篇文章中解释如何做到这一点。 首先&#xff0c;我们需…

基于ArcGIS的晕线制作

在借助ArcGIS进行制图时&#xff0c;我们有时需要为矢量边界添加晕线&#xff0c;今天就来探索一下基于ArcGIS的晕线制作操作。 软件版本&#xff1a;ArcMap10.4.1 方法一&#xff1a;制作多环缓冲区 工具路径&#xff1a;Analysis Tools-Proximity-Mutiple Ring Buffer 思…

Python 基础(七):与时间相关的模块

目录 1 time 模块1.1 struct_time 类1.2 常用函数 1 time 模块 time 模块提供了很多与时间相关的类和函数&#xff0c;下面我们介绍一些常用的。 1.1 struct_time 类 time 模块的 struct_time 类代表一个时间对象&#xff0c;可以通过索引和属性名访问值。对应关系如下所示&…

前后端跨域问题

告别烦恼&#xff0c;彻底解决跨域问题的终极指南-chrome的安全进阶之路_chrom 强制跨域-CSDN博客

融优学堂-艺术史

导论4 1.【单选题】根据导论的讲解&#xff0c;下列表述正确的是&#xff08;&#xff09;。&#xff08;1&#xff09;艺术品是因人的活动而被创造出来的人工制品。&#xff08;2&#xff09;许多物品被制造出来时&#xff0c;最初的目的是满足某种实用的用途&#xff0c;而不…

在linux安装LAStools

LAStools下载&#xff1a; https://github.com/LAStools/LAStools/releases 编译安装&#xff1a; # 设置安装路径 cmake -DCMAKE_INSTALL_PREFIX/home/vis/work/SourceCode/LAStools-2.0.2/build cmake . cmake --build . make install编译后的库&#xff1a;

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

node版本过高与node-sass不兼容问题

第一步&#xff1a;安装yarn 安装cnpm 第二步&#xff1a;yarn install 这一步可能会出现node版本过高报错 yarn config set ignore-engines true 执行 自动补充兼容命令 然后重新yarn install 出现报错&#xff1a; 第三步&#xff1a;使用cnpm 单独安装 cnpm install node-…

Acrel-1000安科瑞变电站综合自动化系统选型与应用

摘 要&#xff1a;变电站综合自动化系统是将变电站内的二次设备经过功能的组合和优化设计&#xff0c;利用先进的计算机技术、通信技术、信号处理技术&#xff0c;实现对全变电站的主要设备和输、配电线路的自动监视、测量、控制、保护、并与上级调度通信的综合性自动化功能。为…

【Docker】网络配置的三种方式

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

烧钱地推的反思

烧钱地推是一种独特的互联网企业的市场竞争手段。 1.地推的成本分析 最开始比较低等的地推方式是&#xff0c;为了获得一手的活动客户流&#xff0c;最开始的方式主要有扫码关注、注册或是转发送一些廉价的赠品&#xff0c;如气球、杯子、毛绒玩具、廉价多肉等等。 除此之外…

【C++】- 类和对象(运算符重载!!const!!详解!!)

类和对象③ 介绍运算符重载赋值运算符重载运算符重载const 在学习C语言时&#xff0c;我们首先接触的就是变量&#xff0c;再深入学习&#xff0c;我们可以利用运算符对变量进行操作&#xff0c;当我们使用C编写程序时&#xff0c;经常会遇到一些需要对特殊的例如自定义数据类型…

WEB 3D技术 three.js 3D贺卡(2) 加入天空与水面效果

上文 WEB 3D技术 three.js 3D贺卡(1) 搭建基本项目环境 我们简单搭了一个贺卡雏形 然后 我们要引入一个hdr的一个天空的效果 所以 我们需要在代码中导入 RGBELoader //导入 RGBELoader hdr工具 import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"…

文件加密怎么设置?文件工具哪个好用?

在使用电脑时&#xff0c;我们可以通过加密来保护电脑中的重要文件&#xff0c;那么&#xff0c;文件加密要怎么设置呢&#xff1f;下面我们就来了解一下。 文件夹加密超级大师 作为“加密大师”&#xff0c;文件夹加密超级大师支持文件加密功能&#xff0c;并提供了金钻加密和…

使用 Picocli 开发 Java 命令行,5 分钟上手

大家好&#xff0c;我是鱼皮&#xff0c;对不会前端的同学来说&#xff0c;开发 命令行工具 是一种不错的展示系统功能的方式。在 Java 中开发命令行工具也很简单&#xff0c;使用框架&#xff0c;几分钟就能学会啦~ Picocli 入门 Picocli 是 Java 中个人认为功能最完善、最简单…