ant-design / pro-components

🏆 Use Ant Design like a Pro!
https://pro-components.antdigital.dev
MIT License
4.04k stars 1.29k forks source link

🐛[BUG] 嵌套 2 层 ProFormList 调用 getCurrentRowData 返回 undefined #5155

Closed AtLastDopamine closed 1 year ago

AtLastDopamine commented 2 years ago

🐛 bug 描述

嵌套 2 层 ProFormList 使用 RenderProps 模式,调用 getCurrentRowData 没有按照预期返回本行数据,而是返回 undefined

📷 复现步骤

在第二层的 ProFormText 输入框在输入,控制台会打印

🏞 期望结果

应该返回本行数据

💻 复现代码

https://codesandbox.io/s/proform-list-forked-yhbb9m

import React from "react";
import ProForm, { ProFormList, ProFormText } from "@ant-design/pro-form";

const Demo = () => {
  return (
    <ProForm
      onFinish={async (v) => {
        console.log(v);
      }}
    >
      <ProFormList
        name="lv1"
        label="第一层"
        itemContainerRender={(doms) => <ProForm.Group>{doms}</ProForm.Group>}
      >
        {() => {
          return (
            <>
              <ProFormText name="lv1Name" label="层级" />

              <ProFormList
                name="lv2"
                label="第二层"
                itemContainerRender={(doms) => (
                  <ProForm.Group>{doms}</ProForm.Group>
                )}
              >
                {(f, index, action) => {
                  return (
                    <ProFormText
                      name="lv2Name"
                      label="层级"
                      fieldProps={{
                        onChange: () => {
                          console.log(
                            "我是第二层的 getCurrentRowData:",
                            action.getCurrentRowData()
                          );
                        }
                      }}
                    />
                  );
                }}
              </ProFormList>
            </>
          );
        }}
      </ProFormList>
    </ProForm>
  );
};

export default Demo;

© 版本信息

🚑 其他信息

image
github-actions[bot] commented 2 years ago

Hello @AtLastDopamine. We totally like your proposal/feedback, welcome to send us a Pull Request for it. Please provide changelog/TypeScript/documentation/test cases if needed and make sure CI passed, we will review it soon. We appreciate your effort in advance and looking forward to your contribution!

你好 @AtLastDopamine,我们完全同意你的提议/反馈,欢迎直接在此仓库 创建一个 Pull Request 来解决这个问题。请务必提供改动所需相应的 changelog、TypeScript 定义、测试用例、文档等,并确保 CI 通过,我们会尽快进行 Review,提前感谢和期待您的贡献。

giphy

Lands-1203 commented 2 years ago

demo链接是不是给错了?

Lands-1203 commented 2 years ago

第一层的action.getCurrentRowData()打印出来是什么效果?

bowencool commented 1 year ago

遇到一样的问题了。 我尝试使用第一层的 data + 第二层的 index 获取数据。但是删除数据时,第一层的 data 始终不会变化,导致数据不准。

bowencool commented 1 year ago

demo链接是不是给错了?

https://codesandbox.io/s/proform-list-forked-yhbb9m

bowencool commented 1 year ago

@AtLastDopamine 你最后怎么解决的?

AtLastDopamine commented 1 year ago

@AtLastDopamine你最后怎么解决的?

ProForm 自身不是有 refformRef),我直接使用的是formRef 使用formRef例如 formRef.current.setFields() 方法,核心的问题是如何获取path; 因为我的有多层,其中一些部分我抽成了公共组件,所以都是由父组件传递进来path; 在ProFormList的 Children Props 中你可以获取到当前的下标,有了下标你就可以生成当前的path

我的代码在内网,不能分享出来。在问题修复之前,这是我现在用的解决办法,确实要麻烦不少

bowencool commented 1 year ago

@AtLastDopamine你最后怎么解决的?

ProForm 自身不是有 refformRef),我直接使用的是formRef 使用formRef例如 formRef.current.setFields() 方法,核心的问题是如何获取path; 因为我的有多层,其中一些部分我抽成了公共组件,所以都是由父组件传递进来path; 在ProFormList的 Children Props 中你可以获取到当前的下标,有了下标你就可以生成当前的path

我的代码在内网,不能分享出来。在问题修复之前,这是我现在用的解决办法,确实要麻烦不少

谢谢,我刚才用 ProFormDependency 也能取到当前行了

liudiming commented 1 year ago

你没设置值,所以获取的是undefined

AtLastDopamine commented 1 year ago

第一层的action.getCurrentRowData()打印出来是什么效果?

链接没有错,要复制出来打开浏览器,直接点好像不行。 第一层是正确的,能获得预期值

image
AtLastDopamine commented 1 year ago

你没设置值,所以获取的是undefined

额,不是很懂你的意思🤔。 我是获取输入框的值(表单项),为什么要设置值呢。 也可以理解为我想获取 ProForm 中维护的最新的 Store 的属性

mumian2 commented 1 year ago

@AtLastDopamine你最后怎么解决的?

ProForm 自身不是有 refformRef),我直接使用的是formRef 使用formRef例如 formRef.current.setFields() 方法,核心的问题是如何获取path; 因为我的有多层,其中一些部分我抽成了公共组件,所以都是由父组件传递进来path; 在ProFormList的 Children Props 中你可以获取到当前的下标,有了下标你就可以生成当前的path

我的代码在内网,不能分享出来。在问题修复之前,这是我现在用的解决办法,确实要麻烦不少

这个获取path是什么

mumian2 commented 1 year ago

大佬这个解决不是很懂 能再讲讲吗

mumian2 commented 1 year ago

大佬这个解决不是很懂 能再讲讲吗 @AtLastDopamine

bowencool commented 1 year ago

大佬这个解决不是很懂 能再讲讲吗

formRef.current?.getFieldValue([
            ...fullPath,
            name,
            index,
          ])
mumian2 commented 1 year ago

这是在子类获取父类的的吗

AtLastDopamine commented 1 year ago

@mumian2 我更新了一下 示例代码,你重点看 49 行。

如果链接打不开,你把链接在复制一边用浏览器打开。就是我复现代码标题的链接,App.ts 文件

我尽力描述啦🤣

mumian2 commented 1 year ago

@mumian2 我更新了一下 示例代码,你重点看 49 行。

如果链接打不开,你把链接在复制一边用浏览器打开。就是我复现代码标题的链接,App.ts 文件

我尽力描述啦🤣

@AtLastDopamine 我点开这个示例还是获取的undefined image

AtLastDopamine commented 1 year ago

@mumian2

咦,不对呀,我更新了的呢。 这是我的打印结果,你这个明显是老的

image
mumian2 commented 1 year ago

https://codesandbox.io/s/proform-list-forked-yhbb9m 好的好的 谢谢了

mumian2 commented 1 year ago

@AtLastDopamine 大佬 我自己的ProFormList封装成一个组件引入父类中 然后我这个组件需要被包裹才能获取到子类的值吗

mumian2 commented 1 year ago

image 只用了父类的path都可以获取到内层ProFormList的值

mumian2 commented 1 year ago

image 只用了父类的path都可以获取到内层ProFormList的值

我自己的ProFormList当作组件引入的时候只能获取到外层的值

bowencool commented 1 year ago

啥意思,修好了吗

chenshuai2144 commented 1 year ago

大佬不是给解决了?

bowencool commented 1 year ago

这楼里面都是些备用方案吧

大佬不是给解决了?

AtLastDopamine commented 1 year ago

这楼里面都是些备用方案吧

大佬不是给解决了?

臣附议。

虽然作为伸手党很不好,但是想想还要提供测试用例和读源码,对我个人而言还是有些劝退。我表示很抱歉。

目前解决是借助 ProFormApi 来实现的,但是这个问题是 ProFormListgetCurrentRowData 的方法没有按照文档中的描述运行🤔。

privatez commented 1 year ago

升级 pro-form 版本到 1.74.6,问题已解决。