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

使用 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 模板结构,用于展示父子元素的拖拽列表:

  • {{item.name}}
    • {{subItem.name}}

关键点:

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) {    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: grabbing;}.example-list li:hover {    background-color: #f5f5f5;}ul {    list-style-type: none;    padding: 0;}

总结

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1532027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 23:21:00
下一篇 2025年12月20日 23:21:13

相关推荐

  • JavaScript获取浏览器默认字体大小的实用方法

    本文将详细介绍如何使用javascript获取用户浏览器设置的默认字体大小。通过动态创建dom元素并应用`font-size: initial`样式,我们可以利用`window.getcomputedstyle`准确地检测出浏览器默认的基准字体,这对于实现更具适应性和无障碍性的网页设计至关重要。 在…

    2025年12月20日
    000
  • JavaScript箭头函数与词法作用域

    箭头函数通过词法绑定继承外层this,避免了运行时this指向的不确定性。例如在setTimeout中使用箭头函数可正确访问对象属性,而普通函数会丢失this绑定。箭头函数无自身this、arguments,不能作为构造函数,适用于回调等需保持外层作用域的场景,但不适用于需要动态this或argum…

    2025年12月20日
    000
  • 动态生成输入框在PHP表单提交后保留值的方法

    本文旨在解决javascript动态创建的表单输入框在php提交后无法自动保留用户输入值的问题。通过将php的`$_post`数据转换为json格式,并将其嵌入到javascript变量中,我们可以在页面重新加载时,利用javascript读取这些数据,并动态地将值填充回相应的输入框,从而实现用户输…

    2025年12月20日
    000
  • JavaScript获取浏览器默认字体大小:深入解析与实现

    本文详细介绍了如何利用javascript获取用户在浏览器设置中配置的默认字体大小。通过动态创建元素并应用`initial`字体样式,结合`getcomputedstyle`方法,可以准确地获取这一关键用户偏好设置,为前端开发提供更个性化的用户体验。文章提供了完整的代码实现和注意事项。 理解浏览器默…

    2025年12月20日
    000
  • 如何优雅地处理异步操作期间的用户输入:避免UI冲突的策略

    在Web应用中,当异步操作(如服务器请求)正在进行时,用户输入可能导致UI状态混乱或数据丢失。本文将探讨两种有效策略来解决这一问题:一是将异步结果与用户输入进行智能拼接而非简单替换;二是采用事件捕获与输入缓冲机制,确保异步操作完成后再处理用户输入,从而实现平滑且符合预期的用户体验。 引言:异步操作与…

    2025年12月20日
    000
  • React useState:高效更新数组中特定元素的属性

    本文详细介绍了在react中使用`usestate` hook管理数组状态时,如何正确地更新数组中特定元素的属性。核心在于遵循react的不可变性原则,通过创建新数组而非直接修改现有状态。文章提供了两种主要方法:利用`map`函数进行通用条件更新,以及通过索引结合展开运算符进行特定位置更新,并附带示…

    2025年12月20日
    000
  • lodash.once() 在单元测试中的模拟与重置策略

    本文探讨了在单元测试环境中如何有效处理 `lodash.once()` 函数的状态问题,以避免测试间的副作用和污染。通过介绍 jest 等测试框架的模块模拟功能,文章详细阐述了如何重写 `once` 方法,确保每次测试都能获得一个干净、可控的执行环境,并分析了这种模拟策略在实现“重置”效果上的作用。…

    2025年12月20日
    000
  • 解决Firefox中iframe加载Base64编码文本的跨浏览器方案

    本文旨在解决在不同浏览器中,特别是firefox,通过`data:`uri将base64编码的文本内容加载到`iframe`时遇到的兼容性问题。我们将探讨传统`iframe.src`方法的局限性,并提出一种更为健壮的跨浏览器解决方案,即直接通过`iframe.contentdocument.body…

    2025年12月20日
    000
  • MongoDB聚合管道实现多字段乘积排序

    本文详细介绍了如何在MongoDB中使用聚合管道(Aggregation Pipeline)对多个字段的乘积结果进行排序。针对直接使用`$expr`在`sort`阶段进行复杂计算排序无效的问题,教程提供了一种有效的解决方案:通过`$addFields`阶段创建计算字段,然后利用`$sort`阶段对该…

    2025年12月20日
    000
  • JavaScript静态站点生成器

    JavaScript静态站点生成器基于Node.js,将Markdown等转为HTML。主流工具包括:1. Gatsby(React+GraphQL),2. Next.js(可静态导出),3. Eleventy(轻量多模板支持),4. Nuxt.js(Vue生态)。选型需考虑技术栈、构建速度、部署便…

    2025年12月20日
    000
  • 函数式编程在JavaScript中的实践

    函数式编程强调纯函数、不可变数据和声明式风格。JavaScript通过高阶函数、闭包等特性支持该范式。纯函数确保输入一致则输出一致,无副作用,如add(a,b) => a+b。避免修改原数据,应使用扩展运算符创建新数据,如[…arr, 4]。利用map、filter、reduce实…

    2025年12月20日
    000
  • JavaScript装饰器模式实现

    装饰器模式通过包装对象动态扩展功能而不修改其结构。JavaScript凭借原型和函数式特性,支持函数装饰(如日志、性能监控)、类/方法装饰(如只读、参数校验)及手动对象装饰,实现关注点分离与代码复用。 装饰器模式允许你动态地给对象添加新功能,而不改变其原始结构。在 JavaScript 中,这种模式…

    2025年12月20日
    000
  • JavaScript装饰器模式与元编程技术

    装饰器模式是一种动态扩展对象功能的技术,通过包装类或方法实现行为增强而不修改原对象。JavaScript中借助TypeScript或Babel支持,可用@语法实现类、方法、参数等的修饰,如@logClass记录实例化、@readonly限制属性重写、@validate校验参数。装饰器在定义时执行,属…

    2025年12月20日
    000
  • 优化JavaScript中相似函数参数重复定义:Proxy模式实践

    本文探讨了JavaScript中相似函数或方法参数重复定义的痛点,尤其是在处理大量参数或扩展框架类时。针对这一问题,文章提出了一种基于JavaScript `Proxy`对象的解决方案,通过在构造函数中拦截方法调用,动态地根据方法名映射并提取所需参数,从而显著减少代码冗余,提升模块化和可维护性。 在…

    2025年12月20日
    000
  • React结合Socket.io与Context API实现房间内用户列表显示

    本教程详细介绍了如何在react应用中,利用context api管理房间信息,并结合socket.io实时获取用户数据,通过在`map`函数中进行条件渲染,精确显示当前房间内的活跃用户列表。文章将提供具体的代码示例和实现步骤,帮助开发者构建功能完善的实时聊天应用,确保用户只能看到其所在房间的成员。…

    2025年12月20日
    000
  • 探索Stacks Editor的LaTeX数学公式增强与替代方案

    本文探讨了在stack overflow的markdown编辑器(stacks editor)中集成latex数学公式支持的挑战。尽管stacks editor功能强大,但其原生版本不直接支持latex渲染。文章提供了编辑器的基本设置示例,并指出在现有框架下实现latex支持的局限性,同时推荐了如s…

    2025年12月20日
    000
  • JavaScript音频视频处理与WebRTC

    JavaScript通过getUserMedia采集音视频流,结合RTCPeerConnection实现WebRTC点对点通信,利用Web Audio API处理音频,通过RTCDataChannel传输任意数据,构建实时音视频应用。 JavaScript 在现代浏览器中提供了强大的音频视频处理能力…

    2025年12月20日
    000
  • 使用Fetch API处理嵌套数据:解决‘undefined’错误并优化代码

    本文详细讲解在使用javascript fetch api获取嵌套或关联数据时,如何避免因数据结构理解偏差导致的`undefined`错误。通过rick and morty api的实际案例,我们将探讨两种有效的数据整合方法:嵌套promise链和更现代、可读性更强的`async/await`模式,…

    2025年12月20日 好文分享
    000
  • JavaScript动画:解决CSS定位属性冲突导致的过渡失效问题

    本文深入探讨了javascript驱动的css动画中,当同时操作元素的`left`和`right`定位属性时,可能导致过渡效果失效的常见问题。文章详细解释了浏览器对此类操作的解析机制,并提供了一种通过统一使用单一水平定位属性(如`right`)来确保动画平滑过渡的解决方案,并通过一个卡片移动的实际案…

    2025年12月20日
    000
  • TypeScript中处理未赋值对象与真值检查的策略

    本文探讨了在TypeScript中对未赋值变量进行真值检查时遇到的常见编译错误,特别是当变量被声明为object类型时。通过深入分析TypeScript的类型系统和控制流分析,文章提出了两种核心解决方案:使用联合类型(object | undefined或object | null)来明确变量可能存…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信