pro-components icon indicating copy to clipboard operation
pro-components copied to clipboard

更新proTable中columns列后,seach中定义select中options无法拿到数据

Open singgl opened this issue 2 years ago • 13 comments

提问前先看看:

https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md

根据定义数据控制columns列数展示,更新后search中定义select下拉框无法获取到options

💻 示例代码

🚑 其他信息

singgl avatar Jun 09 '23 06:06 singgl

const columns = [
   {
      title: '客户',
      dataIndex: 'customerId',
      hideInTable: true,
      valueType: 'select',
      fieldProps: {
        showSearch: true,
        showArrow: true,
        allowClear: true,
        defaultActiveFirstOption: true,
        notFoundContent: '暂无数据',
        placeholder: "请输入客户名称",
        onSearch: handleSearch,
        options: (dataList || []).map((d) => ({
          value: d.id,
          label: d.name,
        }))
      }
    },
] 
const [cloumn, setCloumn] = useState<any[]>(columns)
  const options = [
    {
      title: "操作",
      dataIndex: 'option',
      valueType: 'option',
      className: 'UserOption',
      width: 120,
      render: (_: any, record: any) => [
            <Button
              danger
              key="delete"
              disabled={record.shutdown}
              onClick={async (e) => {
                e.stopPropagation();
            >
              关闭
            </Button>
        </div>
      ],
    }
  ]
  useEffect(() => { 
     const data = [
        ...columns,
        ...options
      ]
      console.log(data)
      setCloumn(data)
    return ()=> {
      console.log('我走了...')
      setCloumn(columns)
    }
  }, [])
更新后打印下拉数据是存在的但是在组件里确拿不到数据?

singgl avatar Jun 12 '23 08:06 singgl

TAutomatically replying with ChatGPT can be attempted, but it cannot be guaranteed to be completely accurate and may not fully address all issues. Please feel free to reply if you have any further questions or concerns. 此回复基于 ChatGPT 自动生成,可以尝试下方案,官方人员会在一定时间后继续继续处理。

根据您提供的代码,我注意到您在 useEffect hook 中将 options 数组合并到了 columns 数组,并将合并后的数据保存在 cloumn 状态中。根据您的描述,您更新了 columns,但无法在搜索组件中获取到下拉框的选项数据。

问题可能出在 useEffect 的依赖数组 [] 上。在这种情况下,useEffect 只会在组件挂载时运行一次,因此只对初始化时的 columns 生效。当您更新 columns 后,cloumn 状态并没有相应地更新。

解决方案是将 useEffect 的依赖数组修改为 [columns],这样当 columns 发生变化时,useEffect 就会重新执行,更新 cloumn 状态。

useEffect(() => { 
  const data = [
    ...columns,
    ...options
  ];
  console.log(data);
  setCloumn(data);
  
  return () => {
    console.log('我走了...');
    setCloumn(columns);
  };
}, [columns]);

另外,请确保确保 handleSearch 函数能够处理搜索操作,并返回相应的结果。您可以通过在 handleSearch 中调用 API 或使用本地数据进行模糊搜索。如果您需要将搜索结果应用到数据列表上,请确保在搜索结果返回后更新 dataList 状态。

如果您对如何实现模糊搜索以及更新数据列表有疑问,您可以参考 React 官方文档中关于数据管理的部分:

  1. React Hooks:https://reactjs.org/docs/hooks-intro.html
  2. React 组件生命周期:https://reactjs.org/docs/state-and-lifecycle.html

希望这些信息能够帮助您解决问题!如果您还有其他疑问,请随时提问。

chenshuai2144 avatar Jul 13 '23 08:07 chenshuai2144

useEffect(() => { const data = [ ...columns, ...options ] console.log(data) setCloumn(data) return ()=> { console.log('我走了...') setCloumn(columns) } }, [columns ])监听columns会出现死循环导致内存溢出,该方式试验过,目前正解的方式是通过request方式可以正常获取数据,不知是否又其他方式

singgl avatar Jul 14 '23 04:07 singgl

TAutomatically replying with ChatGPT can be attempted, but it cannot be guaranteed to be completely accurate and may not fully address all issues. Please feel free to reply if you have any further questions or concerns. 此回复基于 ChatGPT 自动生成,可以尝试下方案,官方人员会在一定时间后继续继续处理。

非常抱歉之前的回答没有考虑到可能出现的问题。如果在 useEffect 中监听 columns 会导致死循环,可以尝试使用 useCallback 进行包装,以避免不必要的更新触发。

const updateColumns = useCallback(() => {
  const data = [
    ...columns,
    ...options
  ];
  console.log(data);
  setCloumn(data);
}, [columns]);

useEffect(() => { 
  updateColumns();
  
  return () => {
    console.log('我走了...');
    setCloumn(columns);
  };
}, [updateColumns]);

使用 useCallback 包装 updateColumns 函数后,它将在 columns 更新时返回一个稳定的引用,从而避免了多余的更新。

此外,您提到通过请求方式可以获取到数据,但不知道是否有其他方式。如果您能提供更多关于请求方式的代码或上下文,我将尽力为您提供更准确的解决方案。

希望这次的回答对您有帮助,如果还有其他问题,请随时提问。

chenshuai2144 avatar Jul 16 '23 12:07 chenshuai2144

通过useCallback包裹后,测试还是会出现栈溢出 代码示例 image 异常错误如下 image

singgl avatar Jul 20 '23 08:07 singgl

image 这个也要 callback掉,不然死循环了

chenshuai2144 avatar Jul 20 '23 14:07 chenshuai2144

我没看懂你的目标是什么,能提供个 gif 吗?

chenshuai2144 avatar Jul 20 '23 14:07 chenshuai2144

image

singgl avatar Jul 25 '23 02:07 singgl

先设置为空,然后在设置为你计算的链路

chenshuai2144 avatar Jul 26 '23 02:07 chenshuai2144

请求数据在useEffect拿到的这个时候set一次options,然后在另一个useEffect去setColumns,setColumns前是可以取值的.setColumns后是取不到值

singgl avatar Jul 31 '23 02:07 singgl

请求数据在useEffect拿到的这个时候set一次options,然后在另一个useEffect去setColumns,setColumns前是可以取值的.setColumns后是取不到值

哥 你解决了吗?

akira0912 avatar Oct 07 '23 02:10 akira0912

离谱,manualRequest 改为 true,不自动触发。发现 options 没有值了

MellowCo avatar Nov 25 '23 01:11 MellowCo