微信小程序真机上@longpress不触发,需改用view+background-image模拟图片容器,并显式设置宽高、background-size和user-select:none;调用uni.showActionSheet前须校验scope.writePhotosAlbum授权且item数≤6。

微信小程序真机上@longpress不触发?先换掉image标签
这不是你代码写错了,是微信小程序对原生image组件做了长按行为拦截——哪怕绑了@longpress,真机上也大概率没反应。必须放弃语义化image,改用view模拟。
关键实操点:
-
view必须显式设置width和height(不能靠内容撑开) - 用
background-image: url(...)加载图片,加background-size: cover或contain - 加上
user-select: none,避免iOS误触发文字选择 - 绑定事件时建议加
@touchstart.stop=""防误触:@longpress="onLongPress"
调用uni.showActionSheet前要校验什么?
直接调用uni.showActionSheet在部分安卓机或未授权状态下会静默失败,甚至报错permission denied。不是所有平台都默认允许相册写入,尤其首次调用时。
实操建议:
- 先用
uni.getSetting查scope.writePhotosAlbum是否已授权 - 未授权时,用
uni.authorize({scope: 'scope.writePhotosAlbum'})引导用户授予权限 -
itemList数组长度不能超过6项,超了会直接报错itemList length must be less than or equal to 6 - H5端不支持
uni.showActionSheet,需降级为v-if弹窗或跳转页面
用uni-popup做自定义菜单,为什么点不消失?
常见现象:菜单弹出来,点某一项后弹窗还在——问题不在UI,而在close()调用方式不对。
Vue 2 和 Vue 3 的 ref 调用逻辑完全不同:
- Vue 2:模板写
ref="popup",方法里写this.$refs.popup.close() - Vue 3(setup):声明
const popupRef = ref(null),模板绑定ref="popupRef",点击回调里写popupRef.value?.close() - 别用
v-model控制显隐,部分版本存在兼容问题 - 如果菜单项是动态渲染的(比如从接口拿),确保
close()在$nextTick后调用,否则DOM可能还没更新
长按识别小程序码?别指望image原生支持
想让用户长按图片直接识别小程序码,目前只有微信原生image在特定场景下支持(如聊天消息里的小程序码),uni-app 的image组件不继承该能力。强行绑定@longpress无法触发识别逻辑。
可行路径只有两条:
- 用
uni.previewImage打开图片,它内置长按菜单(含“识别图中小程序码”选项),但仅限微信小程序且需图片含有效小程序码 - 放弃“长按识别”,改用按钮引导:“点击识别” → 调用
uni.scanCode({ onlyFromCamera: false })并传入图片URL做解析(需后端配合)
真正容易被忽略的是:即使你用view+background-image实现了长按,也只拿到“用户长按了”,识别动作仍需额外API或服务支持,不是CSS或事件绑定能解决的。


















