news 2026/5/9 17:36:48

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/4/30 5:10:16

基于python的养老院健康跟踪系统分析系统(源码+lw+部署文档+讲解等)

课题介绍 本课题针对养老院老人健康跟踪管理中存在的健康数据记录繁琐、体征监测不及时、健康异常预警滞后、健康档案管理杂乱、医护与家属对接不便等痛点&#xff0c;开展基于Python的养老院健康跟踪系统的分析与设计。系统采用Python语言搭建高效稳定的服务架构&#xff0c;整…

作者头像 李华
网站建设 2026/5/9 16:12:55

以下因素是双膜储气柜寿命长久的充分条件

膜材防腐专用 &#xff1a;内膜、外膜和底膜都采用防腐专用膜材&#xff0c;采用耐腐蚀的环保专用复合材料&#xff0c;主要由高强抗拉纤维、气密性防腐涂层、表面涂层组成&#xff0c;具有防腐、抗老化、抗微生物及紫外线等功能&#xff0c;并且防火级别达到B1级标准。先进的焊…

作者头像 李华
网站建设 2026/5/8 9:25:59

基于Python+Django的校园二手物品交易系统(源码+lw+部署文档+讲解等)

课题介绍 本课题针对校园内二手物品闲置浪费、交易渠道分散、交易安全无保障、物品检索不便、师生交易沟通低效等痛点&#xff0c;设计并实现基于PythonDjango的校园二手物品交易系统。后端采用Python语言结合Django框架搭建高效稳定的服务架构&#xff0c;整合ORM框架实现数据…

作者头像 李华
网站建设 2026/4/25 18:19:24

神经网络十年演进

神经网络&#xff08;Neural Networks&#xff09; 的十年&#xff08;2015–2025&#xff09;&#xff0c;是从“特定任务的深度学习”向“通用人工智能&#xff08;AGI&#xff09;雏形”跨越的十年。 这十年间&#xff0c;神经网络完成了从**感知&#xff08;看懂/听懂&…

作者头像 李华
网站建设 2026/5/3 3:44:07

依赖注入容器的深度解析:从设计哲学到工程实践

摘要本报告旨在对“依赖注入容器”这一在现代软件开发中至关重要的架构组件进行一次全面、深入且系统性的剖析。我们将超越简单的定义与代码示例&#xff0c;深入其思想根源、工作原理、实现变体、性能权衡及最佳实践。报告将基于既有的网络公开资料&#xff0c;结合深入的工程…

作者头像 李华