新闻中心

使用 Angular CDK 实现父子元素拖拽列表

2025-10-24
浏览次数:
返回列表

使用 angular cdk 实现父子元素拖拽列表

本文旨在指导开发者使用 Angular CDK 创建一个支持父子元素拖拽的列表。我们将详细介绍如何配置 cdkDropList 和 cdkDrag 指令,以及如何处理拖拽事件,实现父元素和子元素之间的自由拖拽。通过本文,你将能够构建一个灵活且可交互的拖拽列表组件。

实现父子元素拖拽列表

Angular CDK (Component Dev Kit) 提供了一套强大的工具,用于构建自定义 UI 组件,其中包括拖拽功能。 要实现一个支持父子元素拖拽的列表,我们需要正确配置 cdkDropList 和 cdkDrag 指令,并处理相应的拖拽事件。

准备工作

确保你已经安装了 Angular CDK。如果没有,可以使用以下命令安装:

npm install @angular/cdk

同时,需要在你的 Angular 模块中导入 DragDropModule:

import { DragDropModule } from '@angular/cdk/drag-drop';

@NgModule({
  imports: [
    // ...
    DragDropModule,
  ],
  // ...
})
export class AppModule { }

HTML 模板

以下是一个基本的 HTML 模板结构,用于展示父子元素的拖拽列表:

<div cdkDropListGroup>
  <ul
    cdkDropList
    [cdkDropListData]="parentList"
    class="example-list"
    (cdkDropListDropped)="drop($event)"
  >
    <li *ngFor="let item of parentList" cdkDrag [cdkDragData]="item">
      {{item.name}}
      <ul
        #childList="cdkDropList"
        *ngIf="item.children"
        [cdkDropListData]="item.children"
        cdkDropList
        (cdkDropListDropped)="drop($event)"
      >
        <li
          *ngFor="let subItem of item.children"
          cdkDrag
          [cdkDragData]="subItem"
        >
          {{subItem.name}}
        </li>
      </ul>
    </li>
  </ul>
</div>

关键点:

MarsCode MarsCode

字节跳动旗下的免费AI编程工具

MarsCode 339 查看详情 MarsCode
  • cdkDropListGroup: 将整个列表包裹在 cdkDropListGroup 中,允许在不同的 cdkDropList 之间拖拽。
  • cdkDropList: 应用于父列表和子列表的 ul 元素,使其成为拖拽容器。
  • cdkDropListData: 绑定到父列表和子列表的数据。
  • cdkDrag: 应用于父列表和子列表的 li 元素,使其成为可拖拽的元素。
  • (cdkDropListDropped): 监听拖拽完成事件,并调用 drop() 方法处理拖拽逻辑。
  • 移除 [cdkDropListConnectedTo]="parentIds": 这是解决子元素无法在不同父元素之间拖拽的关键。 cdkDropListConnectedTo 限制了拖拽的目标容器,移除后,子元素可以自由拖拽到任何 cdkDropList 容器中。

组件代码 (TypeScript)

以下是对应的 TypeScript 代码:

import { Component } from '@angular/core';
import { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';

@Component({
  selector: 'app-drag-drop-list',
  templateUrl: './drag-drop-list.component.html',
  styleUrls: ['./drag-drop-list.component.css']
})
export class DragDropListComponent {
  parentList: any[] = [
    { id: 1, name: 'Parent 1', children: [{ id: 11, name: 'Child 1' }, { id: 12, name: 'Child 2' }] },
    { id: 2, name: 'Parent 2', children: [{ id: 21, name: 'Child 3' }, { id: 22, name: 'Child 4' }] }
  ];

  drop(event: CdkDragDrop<any[]>) {
    if (event.previousContainer === event.container) {
      moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
    } else {
      transferArrayItem(
        event.previousContainer.data,
        event.container.data,
        event.previousIndex,
        event.currentIndex
      );
    }
  }
}

代码解释:

  • parentList: 包含父元素和子元素的数组。
  • drop(event: CdkDragDrop): 处理拖拽事件的函数。
    • event.previousContainer:拖拽开始的容器。
    • event.container:拖拽结束的容器。
    • event.previousIndex:拖拽元素的原始索引。
    • event.currentIndex:拖拽元素的目标索引。
    • moveItemInArray:如果元素在同一个容器内移动,则使用此函数更新数组。
    • transferArrayItem:如果元素在不同的容器之间移动,则使用此函数更新数组。

CSS 样式 (可选)

为了更好地展示拖拽效果,可以添加一些 CSS 样式:

.example-list {
  border: solid 1px #ccc;
  min-height: 60px;
  background: white;
  border-radius: 4px;
  overflow: hidden;
  display: block;
}

.example-list li {
  padding: 10px;
  border-bottom: solid 1px #ccc;
  color: rgba(0, 0, 0, 0.87);
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  box-sizing: border-box;
  cursor: move;
  background: white;
  font-size: 14px;
}

.example-list li:last-child {
  border: none;
}

.example-list li cdk-drag-preview {
  box-sizing: border-box;
  border-radius: 4px;
  box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
              0 8px 10px 1px rgba(0, 0, 0, 0.14),
              0 3px 14px 2px rgba(0, 0, 0, 0.12);
}

.example-list li cdk-drag-placeholder {
  opacity: 0;
}

.example-list li:active {
  cursor: gra*g;
}

.example-list li:hover {
    background-color: #f5f5f5;
}

ul {
    list-style-type: none;
    padding: 0;
}

总结

通过以上步骤,你就可以使用 Angular CDK 实现一个支持父子元素自由拖拽的列表。 核心在于正确配置 cdkDropList 和 cdkDrag 指令,并处理 drop 事件来更新数据模型。 记住,移除 [cdkDropListConnectedTo] 是实现子元素在不同父元素之间拖拽的关键。 实际应用中,可以根据具体需求调整代码,例如添加拖拽占位符、自定义拖拽预览等。

以上就是使用 Angular CDK 实现父子元素拖拽列表的详细内容,更多请关注其它相关文章!


# html  # 临猗网站优化有效果吗  # 衢州网站优化怎样做的快  # 漯河附近推广营销的地方  # 英语seo教材  # 通化市网站建设排名  # 佛山驾校seo方法  # 这是  # 是一个  # 应用于  # 容器内  # 可以使用  # 使其  # 移除  # 复选框  # 自定义  # 拖拽  # overflow  # bing  # ai  # 工具  # app  # npm  # typescript  # css  # 运维简历网站排名优化  # 锦江网站推广报价  # 广西seo教程案例  # 德化通讯网站推广 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  AO3镜像入口大全 AO3网页版内容访问全集  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  解决Python logging 中 datefmt 导致时间戳固定不变的问题  QQ官网正版登录链接 QQ在线登录入口最新  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  c++如何使用chrono库处理时间_c++标准库时间与日期操作  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  将HTML动态表格多行数据保存到Google Sheet的教程  Golang如何优雅处理error_Golang error处理最佳实践总结  J*aScript中向JSON对象添加新属性的正确姿势  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  mysql如何设置表访问权限_mysql表访问权限配置  AO3最新镜像入口 Archive of Our Own官方平台访问  12306选座怎么选到临时改签座_12306改签选座策略与步骤  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  抖音怎么赚钱_抖音创作者变现方法与途径指南  Python:递归比较文件夹内容并找出特定类型文件的差异  抖音从哪里进入网页版_抖音官方入口链接  J*aScript中高效管理与清空动态列表:避免循环陷阱  如何在J*a中使用Locale处理多语言环境  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  Python Socket多播通信中指定源IP地址的实践指南  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  AO3官方在线访问地址 Archive of Our Own最新镜像合集  如何在 Windows 11 中启动游戏手柄设置  html5 app怎么运行环境_配html5 app运行环境【教程】  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  mc.js游戏直达 mc.js网页免下载版本秒进地址  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  AI泡沫首次被“刺破”:GPU十年都无法存活!  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  微博网页版主页入口 微博官方网站免登录访问  J*aScript实现单选按钮与关联输入框的联动禁用教程  批改网学生版PC登录 批改网官网登录系统入口  css链接悬停下划线样式如何自定义_使用::after结合content和transition  Python字典中优雅地迭代剩余元素的方法  Python模块化编程:有效管理依赖与避免循环引用  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  反效果?《战地6》免费试玩开启后玩家数不升反降  照顾宝贝2小游戏免费秒玩入口  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案 

搜索