news 2026/6/14 4:24:32

uniapp在app端扫码核销(支持自定义内容)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
uniapp在app端扫码核销(支持自定义内容)

效果图如下

本文将详细介绍如何使用 nvue + Barcode 模块实现一个完整的自定义扫码页面。
为什么选择 nvue?
因为uniapp中这个组件的限制

配置:
首先需要在 `manifest.json` 中启用 Barcode 模块:

{ "app-plus": { "modules": { "Barcode": {}, "Camera": {} }, "distribute": { "android": { "permissions": [ "<uses-permission android:name=\"android.permission.CAMERA\"/>" ] } } } }

2. pages.json 配置

在 `pages.json` 中注册页面并隐藏导航栏: { "path": "pages/Shops/code", "style": { "navigationBarTitleText": "扫一扫", "app-plus": { "titleNView": false } } }

页面完整代码

<template> <view class="page"> <!-- 状态栏占位 --> <view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view> <!-- 自定义导航栏 --> <view class="nav-bar"> <view class="nav-back" @click="goBack"> <uni-icons type="left" size="18" color="#333333"></uni-icons> </view> <text class="nav-title">订单核销</text> <view class="nav-placeholder"></view> </view> <!-- 扫码区域容器 --> <view class="scan-container"> <!-- Barcode 组件 --> <barcode ref="barcode" class="barcode" :autostart="false" @marked="onMarked" @error="onError"> </barcode> <!-- 底部提示 --> <view class="bottom-tip" @click="goToManualInput"> <text class="tip-text">无法识别?试试</text> <text class="tip-link">手动输入核销码</text> </view> </view> </view> </template>

Js逻辑代码

export default { data() { return { statusBarHeight: 0, isScanning: false // 防止重复扫码 } }, created() { // 获取状态栏高度,适配不同机型 const systemInfo = uni.getSystemInfoSync(); this.statusBarHeight = systemInfo.statusBarHeight || 0; }, onReady() { // 页面首次加载时启动扫码 this.startScan(); }, onShow() { // 页面显示时重新启动扫码(处理返回场景) this.isScanning = false; this.startScan(); }, methods: { // 启动扫码 startScan() { this.$nextTick(() => { try { const barcode = this.$refs.barcode; if (barcode && barcode.start) { barcode.start(); console.log('扫码已启动'); } } catch (e) { console.log('启动扫码失败:', e); } }); }, // 扫码成功回调 onMarked(e) { // 防止重复处理 if (this.isScanning) { return; } this.isScanning = true; const result = e.detail.code; console.log('扫码结果:', result); // 处理扫码结果 this.handleScanResult(result); // 延迟重置标志 setTimeout(() => { this.isScanning = false; }, 2000); }, // 扫码失败回调 onError(e) { console.log('扫码错误:', e); uni.showToast({ title: '扫码失败', icon: 'none' }); }, // 处理扫码结果 handleScanResult(code) { // 跳转到处理页面或调用接口 uni.navigateTo({ url: '/pages/result?code=' + code }); }, // 手动输入 goToManualInput() { uni.navigateTo({ url: '/pages/manualInput' }); }, // 返回 goBack() { uni.navigateBack({}); } } }

关于css就不公布了,大家可以自己定义。

遇到的一些问题:
1.页面黑屏(考虑Barcode 组件未正确启动)

// 确保在 $nextTick 中启动 this.$nextTick(() => { const barcode = this.$refs.barcode; if (barcode && barcode.start) { barcode.start(); } });

2.扫码后卡死(扫码成功后组件未停止,继续占用摄像头)

- 使用 `isScanning` 标志防止重复处理

- 在 `onShow` 中重置状态

3.返回后无法扫码(autostart 只在首次加载时生效)

onShow() {

this.startScan(); // 手动重启

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 8:03:13

20260205_185752_手把手带做_Agent_智能体,直接让你简历加大分!

你有没有过这种感觉&#xff0c;我们好像正在经历又一个类似移动互联网刚刚兴起的时代&#xff1f; 那时候&#xff0c;有的人抓住了机会&#xff0c;有的人还在观望&#xff0c;几年后&#xff0c;人与人之间的差距就悄然拉开了。如今&#xff0c;人工智能的浪潮来得更猛&…

作者头像 李华
网站建设 2026/6/13 9:00:33

基于Python+Django的框架的胶济铁路博物馆管理系统(源码+lw+部署文档+讲解等)

课题介绍 本课题针对胶济铁路博物馆管理中存在的馆藏文物管控不便、参观预约低效、历史资料归档杂乱、游客信息管理分散、展品讲解服务单一等痛点&#xff0c;设计并实现基于PythonDjango的胶济铁路博物馆管理系统。后端采用Python语言结合Django框架搭建高效稳定的服务架构&am…

作者头像 李华
网站建设 2026/6/13 10:29:35

基于Python+Django的羽毛球服务管理系统(源码+lw+部署文档+讲解等)

课题介绍 本课题针对羽毛球服务管理中存在的球场预约低效、场地管控不便、会员管理杂乱、消费记录统计繁琐、器材库存松散等痛点&#xff0c;设计并实现基于PythonDjango的羽毛球服务管理系统。后端采用Python语言结合Django框架搭建高效稳定的服务架构&#xff0c;整合ORM框架…

作者头像 李华
网站建设 2026/6/14 0:52:48

终结二维统计:镜像视界以空间视频重塑高危作业区人员安全体系——基于 Pixel-to-3D 映射与动态三维实时重构的空间级人员感知技术

终结二维统计&#xff1a;镜像视界以空间视频重塑高危作业区人员安全体系——基于 Pixel-to-3D 映射与动态三维实时重构的空间级人员感知技术发布单位&#xff1a;镜像视界&#xff08;浙江&#xff09;科技有限公司 版本性质&#xff1a;技术白皮书 / 行业解决方案 适用领域&a…

作者头像 李华