我编写了一个demo实现点击标签弹出窗体,在窗体中输入信息然后把数据保存到树形组件中,最后再点击添加上去的组件弹出抽屉的窗体。
部分代码:
//接收项目组件传递的数据 (这段功能已经实现)
const handleSave=(formData)=>{
debugger
// setData([...treeData, formData]); // 将表单数据添加到数组中
const newNode = {
title: `${formData.newNodeNo}-${formData.newNodeName}`,
value: randomId,
children: [
{ title: `${formData.newNodeNo}-${formData.newNodePName} `, value: `${randomId}-1`},
{ title: <PlusCircleOutlined onClick={showModalForm} /> , value: `${randomId}-2`}
],
};
const newData = [...treeData];
if (!selectedNode) {
newData.push(newNode);
} else {
selectedNode.children.push(newNode);
}
setTreeData(newData);
}
const showModalBaisc=()=>{
setIsModalOpenBasic(true);
};
这段代码就是实现上面那段代码保存后的数据,点击里面的+号标签弹出一个窗体输入信息


我想要以下代码实现图片中所描述的功能,把输入的数据保存到这个+号标签的下面注意这个下面是子节点不是平级的,然后点击这个子节点弹出抽屉的对话窗体,主要就是这段代码调整一下就可以了。
const FormSave = (data,value,node) => {
// 找到目标节点并添加新的子节点
let newData = [...treeData];
const addDataToNode = (data, nodeId, newData) => {
for (let i = 0; i < data.length; i++) {
const item = data[i];
nodeId=item.value;
if (item.value === nodeId) {
debugger
if(item.title==<PlusCircleOutlined onClick={showModalForm} />)
{
item.children.push(newData);
}
debugger
console.log('标签',item.title);
break;
} else if (item.children && item.children.length > 0) {
addDataToNode(item.children, nodeId, newData);
}
}
};
const newNodeData = {
title: data.FormName,
value: Math.random().toString(36).substr(2, 9),
onClick: () => showModalBaisc(),
children: [],
};
addDataToNode(newData, node, newNodeData);
setTreeData(newData);
setIsModalOpenForm(false);
// 将要传递给BasicDrawer子组件的数据赋值给basicData状态变量
setBasicData({ ...data, nodeId: randomId });
};
return(
<div>
<ProjectComponets onSave={handleSave} />
<TreeSelect {...tProps} onSelect={onSelect} treeData={treeData} />
<FormComponets
visible={isModalOpenForm}
onClose={handleCloseModal}
onSave={(data, value, node) => FormSave(data, value, node, setTreeData)}
treeData={treeData}
setTreeData={setTreeData} // 确保将setTreeData函数作为属性传递给FormComponets
/>
<BasicDrawer visible={isModalOpenBaic} basicData={basicData}
onClose={handleCloseModalBasic}
/>
</div>
);
子组件
import React, { useState } from 'react';
import { Button, Drawer } from 'antd';
function BasicDrawer({visible,basicData}){
const [open, setOpen] = useState(false);
const onClose = () => {
setOpen(false);
};
return (
<>
<Drawer title="Basic Drawer" visible={visible} placement="right" onClose={onClose}>
<p> {basicData ? basicData.ObjectName : ''}.</p>
<p> {basicData ? basicData.FormName : ''}.</p>
<p> {basicData ? basicData.EnglishName : ''}</p>
</Drawer>
</>
);
}export default BasicDrawer