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

引用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组件中的状态更新非常重要。

【以下回答由 GPT 生成】

问题分析:

根据问题描述,需要在React 18.2版本中使用antd框架实现table控件的数据绑定,并且保证在多个集合下数据绑定不会相互影响。主要问题出现在父组件和子组件之间数据的传递和绑定。

解决方案如下:

  1. 父组件中传递basicMeta作为props给子组件,确保子组件能够获取到数据源。
  2. 子组件中使用useEffect钩子函数,在basicMeta改变时重新绑定数据源并展示数据。使用setColumntwoData方法将绑定后的数据赋值给table。
  3. 为了保证在多个集合下数据绑定不会相互影响,可以在每个集合中增加一个唯一的key作为标识。可以使用父组件中的SolutionNo作为key值。
  4. 在子组件的docMetaSave方法中,在提交数据的时候传递SolutionNo作为参数,用于标识是哪个集合的数据。

代码示例:

// 父组件ListTreeComponets
function ListTreeComponets() {
    const showModallocaDoument = (data, index) => { 
        setSolutionNo(index); // 增加 key 的值,触发子组件重新渲染
        setisopendocmentdw(true);
    }

    return (
        <IndocmentComponets
            isopen={isopendocmentdw}
            onClose={handleCloseModaldo}
            SolutionNo={SolutionNo}
            basicMeta={basicMeta} // 将basicMeta作为props传递给子组件
        />
    );
}

export default ListTreeComponets;


// 子组件IndocmentComponets
function IndocmentComponets(props) {
    const {
        isopen,
        onClose,
        SolutionNo,
        basicMeta // 通过props获取basicMeta数据源
    } = props;

    const [columntwoData, setColumntwoData] = useState([]); // 状态管理table数据

    useEffect(() => {
        if (!basicMeta) {
            setColumntwoData([]);
            return;
        }

        setColumntwoData(
            basicMeta.map((row, index) => ({
                key: `${SolutionNo}-${index}`, // 使用SolutionNo和index作为唯一key值,确保在多个集合下数据绑定不会相互影响
                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,
            }))
        );

        console.log("读取到的数据源信息:", columntwoData);
    }, [basicMeta, SolutionNo]); // 监听basicMeta和SolutionNo的变化,重新绑定数据并更新table

    const docMetaSave = (formData) => {
        // 在提交数据时传递SolutionNo参数,用于标识集合
        // ...
    }

    // 组件渲染及相关逻辑
    // ...

    // 返回组件内容
}

以上是根据问题描述提供的解决方案,希望能帮助到你!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

https://stackoverflow.com/questions/67049097/how-to-bind-data-to-react-table

该问题已经解决