做列表需求的时候,最容易被产品一句话问住:“右滑删除就行,左滑别出来东西。”结果代码改完一跑,发现左右都能滑,甚至菜单还叠一起。别急着写一堆手势判断,ListItem 的“单侧滑动”这件事,九成都是start和end没搞明白。
1. 为什么你的 ListItem 会“两边都能滑”?start 和 end 的真实含义
很多人在 ArkUI 里第一次给ListItem加侧滑菜单,都会经历这么一轮懵圈:打开文档一看,swipeAction里有两个字段,一个叫start,一个叫end。下意识就以为start是“向左滑”,end是“向右滑”。结果配完之后,发现四个方向的滑动行为完全不受控,产品过来看了一眼,说“这不是我要的单侧”。
这其实不是框架的问题,而是这两个字段的概念从一开始就理解反了。
1.1 start 不是“向左”,end 也不是“向右”——它们是左右两条边缘
在 ArkUI 里,ListItem的swipeAction入参是这样一个对象:
swipeAction(value: { start?: CustomBuilder | SwipeActionItem, end?: CustomBuilder | SwipeActionItem })这里的关键是start和end指的是列表项组件自身的“起始边缘”和“结束边缘”,在默认的 LTR(从左到右)布局下:
start对应列表项的左边缘。配置了start,用户手指从左往右滑动时,左侧会拖出操作菜单。end对应列表项的右边缘。配置了end,用户手指从右往左滑动时,右侧会拖出操作菜单。
所以“只能一侧滑动”这句话,放到 ArkUI 里翻译一下就是:你只需要配置start或end其中的一个,另一个不写就行。
如果你两边的字段都写了,那左右两个方向当然都能滑出菜单。我见过不少新人的代码是这样的:
.swipeAction({ start: () => { this.buildStartMenu() }, end: () => { this.buildEndMenu() } })你左滑右滑都有菜单,那不是框架抽风,是你自己在 config 里把两边都开了。
关于start和end,我建议你直接记成“左边缘”和“右边缘”,千万别按英语语感去理解成“开始滑”“结束滑”。
1.2 只配一端,为什么另一边就真的“滑不动”了
可能有人会继续往下问:就算我只配了end,手指从左往右划的时候,列表项不是也会因为触摸而跟着动一下吗?
实测下来,在正常的List容器里,如果没有给start配置任何内容,从左往右滑动ListItem内容区域时,不会拖出任何菜单,也不会有持续的位移跟随。因为框架在开始处理侧滑手势时,会先判断当前方向有没有可展示的菜单,没有就直接不响应,整个手势相当于被丢弃了。
但有一个非常容易误导人的情况:如果你只配了end,手指在列表项上横向轻轻划一下,有时候视觉上还是会有非常轻微的“蹭”一下或者回弹感。这种感受通常来自两个地方:
- `