新闻中心
使用 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
字节跳动旗下的免费AI编程工具
339
查看详情
- 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;
}
.examp
le-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组合解决方案


2025-10-24
浏览次数:次
返回列表
le-list li:hover {
background-color: #f5f5f5;
}
ul {
list-style-type: none;
padding: 0;
}