You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

React rc-tree组件节点删除:文件夹批量删除与图层移除实现

处理rc-tree中文件夹与图层节点的删除逻辑

我来帮你搞定这个rc-tree的节点删除问题,刚好之前做过类似的树形组件操作,咱们一步步梳理逻辑:

首先核心需求很明确:

  • 删除文件夹:要递归清理它下面所有的图层(调用removeLayerWithName),然后移除整个文件夹节点
  • 删除图层:直接调用移除方法,再删除节点

第一步:写一个递归处理子节点的辅助函数

这个函数会遍历目标节点的所有子孙节点,只要是图层类型就调用地图的移除方法:

// 递归遍历节点,处理所有子图层
const handleProcessChildLayers = (node) => {
  // 判断当前节点是否为图层,是则调用移除方法
  if (node.type === 'layer') {
    removeLayerWithName(node.keyName);
  }
  // 如果有子节点,继续递归处理
  if (node.children && node.children.length > 0) {
    node.children.forEach(child => handleProcessChildLayers(child));
  }
};

第二步:实现删除节点的主逻辑

这里需要先处理所有要移除的图层,再更新树形数据删除节点:

const handleDeleteNode = (deletedNode) => {
  // 先处理当前节点及其所有子节点中的图层
  handleProcessChildLayers(deletedNode);
  
  // 从树形数据中移除目标节点(假设你的树形数据存在state的treeData中)
  const updatedTreeData = removeNodeFromTree(treeData, deletedNode.key);
  setTreeData(updatedTreeData);
};

// 辅助函数:递归从树形数据中移除指定key的节点
const removeNodeFromTree = (nodes, targetKey) => {
  return nodes.filter(node => {
    if (node.key === targetKey) {
      return false; // 移除目标节点
    }
    // 递归处理子节点
    if (node.children) {
      node.children = removeNodeFromTree(node.children, targetKey);
    }
    return true;
  });
};

第三步:在rc-tree中使用这个删除逻辑

场景1:使用rc-tree自带的删除图标

如果你的tree配置了showDeleteIcon,直接把handleDeleteNode绑定到onDelete回调即可:

import Tree from 'rc-tree';
import 'rc-tree/assets/index.css';

// ...其他代码

<RcTree
  treeData={treeData}
  showDeleteIcon={true}
  onDelete={handleDeleteNode}
  // 其他配置:比如defaultExpandAll、keys等
/>

场景2:自定义删除按钮

如果需要自定义删除按钮的样式或位置,可以在render方法中添加:

<RcTree
  treeData={treeData}
  render={(node) => (
    <div style={{ display: 'flex', justifyContent: 'space-between', width: '100%' }}>
      <span>{node.title}</span>
      <button 
        style={{ fontSize: '12px', padding: '2px 6px' }}
        onClick={() => handleDeleteNode(node)}
      >
        删除
      </button>
    </div>
  )}
/>

关键注意点

  • 确保你的节点数据中包含type字段(值为folderlayer),用来区分节点类型
  • keyName必须是图层的唯一标识,确保removeLayerWithName能正确找到并移除对应图层
  • 如果你的树形数据是从后端获取的,更新后记得同步后端数据(如果需要的话)

这样不管是删除文件夹还是图层,都能正确处理所有关联的图层节点,同时更新树形结构啦~

内容的提问来源于stack exchange,提问作者Javier

火山引擎 最新活动