自在猫先生 2023-05-09 17:17 采纳率: 62.9%
浏览 25
已结题

React list集合中嵌套树形组件,在操作数据的隔绝继承

我写了一个React的功能,使用andt ui框架中的List组件和Treeselect树形组件
我在子组件中建立了添加数据的功能,并在父组件中进行引用。
我每次点击新建数据,都会保存数据到集合和树形组件中。
场景:
点击新建->输入数据保存->数据存储到集合和树形组件中 形成集合1。
点击新建->输入数据保存->数据存储到集合和树形组件中 形成集合2。集合2中新建的集合里面的树形组件会继承集合
1中的新建完成的树形组件数据。
我想要不继承集合1中的数据,每次新建一个集合都相当于是最新的跟其他的集合不会存在依赖和继承的关系。
思路:可以用一个唯一的值进行区分,或者在进行展开的时候用这个展开组件 重新渲染一下数据。
代码如下:


import { Avatar, List,Collapse,TreeSelect   } from 'antd';
import React, { useState } from 'react';
import ProjectComponets from '../ModalForm/ProjectComponets';
import { PlusCircleOutlined,SolutionOutlined,DeleteOutlined } from '@ant-design/icons';
import SolutionComponets from './SolutionComponets';
import FormComponets from '../ModalForm/FormComponets';
const { SHOW_PARENT } = TreeSelect;
function ListTreeComponets ()  {

  const [searchValue, setSearchValue] = useState('');
  const [value, setValue] = useState(undefined);
  const [listData,setListData]=useState([]);
  const randomId = `SL-${Math.floor(Math.random() * 1000000)}`;
  const [isModalOpenForm,setIsModalOpenForm]=useState(false);
  const [isModalOpenBaic,setIsModalOpenBasic]=useState(false);
  // const [AttributeData, setAttributeData] = useState(null);
  const [selectedNode, setSelectedNode] = useState(null);
  const [selectedAttributeData, setSelectedAttributeData] = useState(null);
  const { Panel } = Collapse;
  const [treeData, setTreeData] = useState([]);// 初始化树形数据
  const [selectedKey,setSelectedKey]=useState(null);
  const [AttributeData, setAttributeData] = useState({ // 初始化为一个空对象
    newNodeNo: '',
    newNodeName: '',
    ProjecTtype: '',
    Parentlevel: '',
  });
  

  const onChange = function (newValue) {
    console.log('val:',newValue)
    setValue(newValue);
};

const onSearch = (value) => {
    setSearchValue(value);
   
};

const onSelect = (value, node) => {
  debugger
    setSelectedNode(node);   
    setSelectedKey(value);
    handleSelectNode(value);
  };

    const tProps = {
    treeData,
    value,
    onChange,
    treeCheckable: true,
    showCheckedStrategy: SHOW_PARENT,
    placeholder: 'Please select',
    style: {
        width: '100%',
        
    },
    filterTreeNode: (node, searchValue) => {
        if (node.title && node.title.toLowerCase) {
          return node.title.toLowerCase().includes(searchValue.toLowerCase());
        }
        return false;
      },
    treeDefaultExpandAll: true,
    onSearch: onSearch,
    onSelect: onSelect,
};

const handleSelectNode = (selectedKey) => {
  debugger
    setSelectedKey(selectedKey); 
  };

  const handleSave = (formData) => {
    const newAttributeData = { ...AttributeData, ...formData };
      // 将新数据与旧数据合并,不替换旧数据
      setAttributeData({...newAttributeData});
      const newNode = {
        title: (
          <span>
            {`${formData.newNodeName}`}
  
          </span>
        ),
        value: `${formData.newNodeNo}-${formData.newNodeName}`, // 使用相同格式作为 value
        children: [
          { title: `${formData.ProjecTtype}-${formData.Parentlevel} `, value: `${randomId}-1` },
          { title: <PlusCircleOutlined onClick={showModalForm} />, value: `${formData.newNodeNo}-${formData.newNodeName}-2`, children: [] }
        ]
      }; 
  
      const TreeNode={
        title: (
          <span>
            {`${formData.newNodeName}`}
            <DeleteOutlined onClick={(event) => handleDelete(`${formData.newNodeNo}-${formData.newNodeName}`, event)} />
            <SolutionOutlined  onClick={() => showModalBaisc(AttributeData)} style={{ marginLeft: '5px', marginRight: '5px' }}/> 
             <PlusCircleOutlined onClick={showModalForm} style={{ marginLeft: '5px', marginRight: '5px' }} /> 
          </span>
        ),
        value: `${formData.newNodeNo}-${formData.newNodeName}`, // 使用相同格式作为 value
       }
  
      setListData([...listData, newNode]); // 将新节点对象附加到现有列表数据中 
      //同时新增到树形组件
      const newData = [...treeData];
      newData.push(TreeNode);
      setTreeData(newData);
  
      setSelectedNode(newNode); // 将新节点设置为当前所选节点
      setSelectedAttributeData(newAttributeData); // 更新 `selectedAttributeData`
    };


  const showModalForm = () => {
    setIsModalOpenForm(true);
  };

const handleCloseModal=()=>{
setIsModalOpenForm(false);
};

const showModalBaisc = (data) => {
  debugger
   setSelectedNode(data);
   setIsModalOpenBasic(true);
};

const handleCloseModalBasic=()=>{
  setIsModalOpenBasic(false);
};

const handleDelete=(value,event)=>{
  event.preventDefault();
  const newData = listData.filter((node) => node.value !== value);
   setListData(newData);
  setTreeData(newData);
}

          const FormSave = (data, nodeId) => {
          
          };

        

  return(

<div>
<ProjectComponets 
onSave={(formData) => handleSave(formData, setListData)}
/>   
/>
      <List style={{width:'50%'}}
  itemLayout="horizontal"
  dataSource={listData}
  renderItem={(item, index) => (
  <Collapse bordered>
    <Panel header={item.title} key={index}>
      <List.Item.Meta
        avatar={<Avatar src={`https://xsgames.co/randomusers/avatar.php?g=pixel&key=${index}`} />}
        description="This is a solution project for generating Word documents"
    
     />
     <TreeSelect  {...tProps} onSelect={onSelect}   treeData={treeData} />
      {/* <PlusCircleOutlined onClick={showModalForm} style={{ marginLeft: '20px', marginRight: '10px' }} />
      <SolutionOutlined  onClick={() => showModalBaisc(AttributeData)}/> */}
    </Panel>
  </Collapse>

  )}
/>
  </div>
  );
};

export default ListTreeComponets;


上图

img

img

img

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-09 20:18
    关注
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月12日
  • 创建了问题 5月9日

悬赏问题

  • ¥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 通信专业本科生论文选这两个哪个方向好研究呀