首页 > 其他分享 >HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置

HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置

时间:2024-04-24 14:12:58浏览次数:29  
标签:ets List NEXT --- HarmonyOS Grid 组件 拖拽

介绍

本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。

效果图预览

使用说明:

  1. 拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。
  2. 拖拽List中子组件,到目标List子组件位置,进行两者位置互换。

实现思路

  1. 在Grid组件中,通过editMode()打开编辑模式、通过onItemDragStart()指定拖拽时样式、通过onItemDrop()指定拖拽释放时的行为。源码参考 https://gitee.com/harmonyos-cases/cases/blob/master/CommonAppDevelopment/feature/dragandexchange/src/main/ets/view/GridSceneView.ets
Grid() { ... }
.editMode(true) // 设置Grid进入编辑模式
.onItemDragStart((event: ItemDragInfo, itemIndex: number) => { // 设置拖拽过程中显示的图形
  this.movedItem = this.appInfoList[itemIndex]; // 记录原位置子组件信息
  return this.itemWhileDrag(); 
})
.onItemDrop((event: ItemDragInfo, itemIndex: number, insertIndex: number, isSuccess: boolean) => { // 拖拽释放时,触发回调
  // isSuccess=false时,说明drop的位置在grid外部;insertIndex > length时,说明有新增元素的事件发生
  if (isSuccess && insertIndex < this.appInfoList.length) {
    this.changeIndex(itemIndex, insertIndex); // 互换子组件index值
  }
})
  1. 在List组件中,通过ListItem的onDragStart()方法指定拖拽开始时的行为,通过List的onTouch()指定拖拽释放时的行为。源码参考ListSceneView.ets
List({ space: LIST_SPACE }) {
  ForEach(this.appInfoList, (item: AppInfo, index) => {
    ListItem() { ... }
    .onDragStart(() => {
      item.visible = false; // 拖拽时,设置子组件原位置图标不可见
    })
    .onTouch((event: TouchEvent) => { // 拖拽释放时,记录目标位置子组件index值
      if (event.type === TouchType.Down) {
        this.dragIndex = index;
      }
    })
  })
}
.onDrop((event: DragEvent, extraParams: string) => {
  let jsonString: JsonObjType = JSON.parse(extraParams) as JsonObjType; // 通过参数extraParams获取原位置子组件index值
  this.changeIndex(this.dragIndex, jsonString.insertIndex); // 互换子组件index值
  this.appInfoList[jsonString.insertIndex].visible = true; // 完成互换后,设置子组件原位置图标不可见
})

高性能知识点

不涉及

模块依赖

@ohos/routermodule(动态路由)

工程结构&模块类型

dragandexchange                  // har类型               
|---pages                                       
|---|---Launcher.ets             // 页面层-方案主页面
|---view                                        
|---|---GridSceneView.ets        // 视图层-Grid拖拽页面             
|---|---ListSceneView.ets        // 视图层-List拖拽页面  
|---model                                     
|---|---AppInfo.ets              // 模型层-App信息模型  

参考资料

  1. 创建网格(Grid/GridItem)
  2. List

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing

    标签:ets,List,NEXT,---,HarmonyOS,Grid,组件,拖拽
    From: https://www.cnblogs.com/HarmonyOSNext/p/18155150

相关文章

  • Nuxtjs如果使用useHead()导入swiper,除了在onMounted调用,切换报错前面使用 await next
     注意:awaitnextTick();如果没用,vue切换的时候可能有问题<scriptlang="ts"setup>import{DArrowRight}from"@element-plus/icons-vue";useHead({script:[{src:"/script/swiper.js",},],link:[{......
  • 鸿蒙HarmonyOS实战-ArkUI动画(放大缩小视图)
    ......
  • HarmonyOS NEXT应用开发实战—组件堆叠
    介绍本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生。当滚动时,实时地调节组件的透明度、高度等属性,从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组件切换。效果图预览使用说明加载完成......
  • doublelist_add
    双向链表的插入操作的相关操作1.头部插入/******************************************************************************函数名称: HeadAdd*函数功能:双向链表的头部插入*函数参数:*@a:*He......
  • LList_DelMin
    删除单链表L(有头结点)中的一个最小值结点。/*************************************************************filename: *author:[email protected]*date:2024/04/23*function: *note:None**CopyRig......
  • HarmonyOS NEXT应用开发—城市选择案例
    介绍本示例介绍城市选择场景的使用:通过AlphabetIndexer实现首字母快速定位城市的索引条导航。效果图预览使用说明分两个功能在搜索框中可以根据城市拼音模糊搜索出相近的城市,例如输入"a",会出现"阿尔山"、"阿勒泰地区"、"安庆"、"安阳"。下方城市列表通过AlphabetIndexer组......
  • HarmonyOS NEXT应用开发—听歌识曲水波纹特效案例
    介绍在很多应用中,会出现点击按钮出现水波纹的特效。效果图预览使用说明进入页面,点击按钮,触发水波纹动画。再次点击按钮,停止水波纹动画。实现思路本例涉及的关键特性和实现方案如下:要实现存在两个连续的涟漪,需要两个层叠的Stack分别以一定延迟进行相同的动画。源码参考......
  • Web3开发者技术选型:前端视角(next.js)
    引言在现代Web开发的世界中,Web3技术的兴起为前端开发者开辟了新的可能性。Web3技术主要指的是建立在区块链基础上的分布式网络,使用户能够通过智能合约和去中心化应用(DApps)直接交互,而无需传统的中介机构。为了有效地开发Web3应用,前端开发者需要掌握一些关键的技术和工具,其中Next.j......
  • k8s 操作命令-合集List
    k8s操作命令合集List ---------------k8s基本常用的命令-----------------------------------------1、创建资源kubectlcreatedeploymentnginx--image=nginx2、列出资源kubectlgetpods3、描述资源kubectldescribepod<pod-name>4、删除资源......
  • centos8报错错误:为 repo 'appstream' 下载元数据失败 : Cannot prepare internal mirr
    出现如下错误的错误:为repo‘appstream’下载元数据失败:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist原因在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS8的所有包。CentOS8已于2021年12月31日寿终正非,但软件包仍在官方镜像上保留了一段时间。现在......