自在猫先生 2023-08-16 15:22 采纳率: 62.9%
浏览 13
已结题

React18.2版本+antd框架实现table控件数据绑定

遇到问题:
无法在多个集合的情况下实现数据绑定,并且不同的集合之间不相互影响。
实现效果:
无论新建的多少个集合,都可以进行数据绑定,并且在绑定不同的数据源的时候多个集合之间不会相互影响。
以下是部分代码以及详细的过程描述:

父组件代码用于打开子组件
function ListTreeComponets(){
//这个方法就是打开子组件的
    const showModallocaDoument=(data,index)=>{ 
    setSolutionNo(index); // 增加 key 的值,触发子组件重新渲染
      setisopendocmentdw(true);
      }
      
//引用子组件
    <IndocmentComponets
  isopen={isopendocmentdw}  
  onClose={handleCloseModaldo}
SolutionNo={SolutionNo}
  />
}export default ListTreeComponets;

子组件绑定数据源并进行展示
function IndocmentComponets(props){

const {
      isopen,
        onClose,
SolutionNo
    }
    =props;

  //数据源赋值给table并进行展示数据
    useEffect(() => {
      debugger
      if (!basicMeta) {
        setColumntwoData([]);
        return;
      }
    debugger
      setColumntwoData(
        basicMeta.map((row, index) => ({
          key: index.toString(),
          table_name: row.table_name,
          attributes: row.attributes,
          en_name: row.en_name,
          zh_name: row.zh_name,
          fields: row.fields,
          length: row.length,
          name: row.name,
          type: row.type,     
        }))
      );
    debugger
      console.log("读取到的数据源信息:",columntwoData)
    }, [basicMeta]);

// 读取api接口数据部分 这里就是获取数据的方法
此处会把绑定数据后会根据父组件传递过来的SolutionNo这个唯一值
追加到这个集合里面用于区分打开的是哪一个集合。
const docMetaSave = (formData, index) => {
  debugger
  const updatedFormData = formData.map((data) => ({
    [formattribute.SolutionNo]: [
      {
        ...data,
        SolutionNo: formattribute.SolutionNo
      }
    ]
  }));

  setBasicMeta(updatedFormData);
  console.log('追加后的from数据', updatedFormData);
};


  const gettabeldata=()=>{
    setisModalOpenMeta(true);
  }

//引用绑定数据源来源组件
<MedataComponets
isopen={isModalOpenMeta}
onClose={handleCloseModalMeta}
onSave={(formData) => docMetaSave(formData)}
/>

//table
 {columntwoData.length > 0 && (
                console.log('dataSource', columntwoData),
                <Table dataSource={columntwoData} columns={columntwo} key={SolutionNo} />
              )}

//单击按钮获取数据源
<Button type="primary" htmlType="default"  onClick={gettabeldata}>
        获取数据源
      </Button>
}export default IndocmentComponets

流程描述:
1.在父组件中点击父组件中标签打开绑定数据源的子组件。
2.在绑定数据源的子组件中点击获取数据源按钮,打开获取数据源的子组件。
3. 通过docMetaSave方法接收获取到的数据源并进行赋值。
4. 通过useEffect加载方法把数组setBasicMeta中的数据赋值给columntwoData。
5. 在table控件中使用columntwoData作为table的数据源最终进行展示。
所遇问题:

  1. 当新建第一个集合集合1并进行数据绑定的时候,假设这里绑定的数据表是:PushTable,我再次进行新建一个集合的时候打开,这个时候这个新建的为集合2,打开后展示的效果为集合1的数据,没有区分开,此时我的集合2还没有进行数据绑定也显示了出来。
  2. ```c# ```这一段代码不管绑定的数据源是什么的样,但是始终为共用的同一个table,要么会继承要么就是会进行覆盖的操作。 流程描述图:

    img

    img

    img

    img

    img


    目前新建集合和获取数据源这一块是没有问题的,现在需要在进行数据绑定的时候想个办法进行区分开来,因为我的集合是动态新建的不是固定的,我有尝试过使用key,和数据筛选这些办法都行不通,主要的问题还是在于绑定数据的
    时候table中的数据源始终都是共用的。
    数据源格式如下:

    img

  • 写回答

4条回答 默认 最新

  • 2301_79233340 2023-08-16 15:45
    关注

    引用chatgpt内容作答:
    看起来你的问题是在React组件中,不同的集合数据绑定后,表格显示的数据没有正确隔离开来。根据你的描述和代码片段,我会给出一些关于如何解决这个问题并实现你想要的行为的指导。

    你主要的问题是,当你创建一个新的集合并绑定数据后,表格会显示之前集合的数据。这是因为你在所有集合中都使用了相同的状态(columntwoData),没有正确地隔离数据。

    为了实现多个集合有独立的数据绑定和隔离效果,你需要为每个集合维护一个单独的状态。一种方法是使用一个对象,其中键表示集合的标识符(在你的情况下是SolutionNo),值表示每个集合的数据数组。

    以下是解决这个问题的步骤概述:

    1、为每个集合维护独立的状态:
    不要再使用单一的 columntwoData 状态来存储所有集合的数据,而是创建一个对象来存储每个集合的数据。这个对象的键是 SolutionNo 值,值是对应的数据数组。

    const [collectionData, setCollectionData] = useState({});
    

    2、为每个集合更新状态:
    当你获取并绑定特定集合的数据时,在 collectionData 状态对象中更新相应的数据。

    const docMetaSave = (formData, solutionNo) => {
      const updatedFormData = formData.map((data) => ({
        // ...
      }));
    
      setCollectionData((prevData) => ({
        ...prevData,
        [solutionNo]: updatedFormData,
      }));
    };
    

    3、渲染表格:
    在组件中渲染表格时,使用 collectionData 状态来获取特定集合的数据。

    {collectionData[SolutionNo] && (
      <Table dataSource={collectionData[SolutionNo]} columns={columntwo} />
    )}
    

    通过按照这些步骤,你可以通过单独的状态对象有效地隔离每个集合的数据。这样,不同的集合就不会相互干扰,每个集合的数据都会正确地显示出来。

    请确保在调用 docMetaSave 函数时传递了正确的 SolutionNo,以便数据与正确的集合关联起来。

    此外,确保在更新状态时使用函数式更新,就像上面的 setCollectionData 示例中所示。这对于正确管理React组件中的状态更新非常重要。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月16日
  • 修改了问题 8月16日
  • 创建了问题 8月16日

悬赏问题

  • ¥15 上传图片时提交的存储类型
  • ¥15 Ubuntu开机显示器只显示kernel,是没操作系统(相关搜索:显卡驱动)
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 在rhel8中安装qemu-kvm时遇到“cannot initialize crypto:unable to initialize gcrypt“报错”
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 paddle库安装时报错提示需要安装common、dual等库,安装了上面的库以后还是显示报错未安装,要怎么办呀?
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀