鸿蒙中 拖拽排序onMove事件
·
本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
开发中,onMove是用于实现拖拽排序功能的核心接口,主要作用于List组件与ForEach/LazyForEach/Repeat的组合场景。
一、功能
- 作用:当用户在List组件中通过长按或拖拽操作改变列表项顺序时,
onMove会捕获数据源位置变化事件(起始索引from和目标索引to),开发时可以通过此回调同步更新数据源,从而实现UI的动态排序。 - 生效条件:
- 父容器必须是List组件
- 列表项必须通过ForEach/LazyForEach/Repeat生成
- 每个迭代项需生成一个ListItem组件
二、参数与回调类型
-
主回调函数
onMove(handler: (from: number, to: number) => void, eventHandler?: ItemDragEventHandler)
handler:必填参数,接收两个数字参数from(原位置索引)和to(目标位置索引),开发时需在此函数内更新数据源顺序。eventHandler(API 20+):可选参数,定义拖拽过程中的附加事件回调,如长按、拖拽开始等。
2. 事件回调对象(ItemDragEventHandler)
| 事件名 | 触发时机 | 参数说明 |
|---|---|---|
onLongPress |
长按列表项时触发 | index为当前项索引 |
onDragStart |
拖拽动作开始时触发 | index为拖拽起始项索引 |
onDrop |
拖拽结束并松手时触发 | index为最终落位项索引 |
三、使用示例(API 12+)
// 在List组件的ForEach中使用onMove
List() {
ForEach(this.arr, (item: string) => {
ListItem() {
Text(item).fontSize(16)
}
})
.onMove((from: number, to: number) => {
const tmp = this.arr.splice(from, 1); // 移除原位置元素
this.arr.splice(to, 0, ...tmp); // 插入到目标位置
})
}
四、扩展事件监听(API 20+)
// 添加拖拽事件回调
.onMove(
(from, to) => {
// 更新数据源逻辑
},
{
onLongPress: (index) => { console.log('长按项索引:', index); },
onDragStart: (index) => { console.log('拖拽开始项:', index); },
onDrop: (index) => { console.log('拖拽结束落位项:', index); }
}
)
五、注意事项:
- 数据源一致性:必须在
onMove中同步修改数据源顺序,否则UI动画与数据会不一致。 - API版本支持:
- 基础功能:API 12+ 支持
- 扩展事件回调(如
onDrop):API 20+ 支持
- 元服务兼容性:基础接口从API 12开始支持元服务,扩展事件从API 20开始支持。
更多推荐



所有评论(0)