【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;
};

最近更新

  1. TCP协议是安全的吗?

    2024-01-17 12:58:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-17 12:58:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-17 12:58:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-17 12:58:04       20 阅读

热门阅读

  1. react组件

    2024-01-17 12:58:04       35 阅读
  2. React16源码: React中的performWork的源码实现

    2024-01-17 12:58:04       26 阅读
  3. Flutter系列:Flutter常见问答(可用于面试)

    2024-01-17 12:58:04       31 阅读
  4. 【架构设计】单体软件向微服务化演变

    2024-01-17 12:58:04       38 阅读
  5. 算法训练营Day41

    2024-01-17 12:58:04       36 阅读
  6. 华为认证云计算专家(HCIE-Cloud Computing)--练习题

    2024-01-17 12:58:04       29 阅读
  7. 配置DNS主从服务器,能够实现正常的正反向解析

    2024-01-17 12:58:04       36 阅读
  8. SpringBoot+Vue实现一个系统登录功能

    2024-01-17 12:58:04       39 阅读