当前位置: 首页 > news >正文

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(); // 手动重启

}

http://www.jsqmd.com/news/346673/

相关文章:

  • AIGC疑似率和传统查重率的本质区别,一文彻底搞懂 - 我要发一区
  • AIGC检测误判怎么申诉?一份完整的申诉指南 - 我要发一区
  • 基于Python网易云排行榜数据分析系统设计与实现(源码+lw+部署文档+讲解等)
  • 基于Python的股票数据可视化设计与实现(源码+lw+部署文档+讲解等)
  • 【deepseek】RT-Thread “无上下文切换“的准确理解
  • Python毕设项目:基于Python的商场停车管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 2/5 日哦咦咦啊咦哦咦咦咦啊咦书上背包进阶练习+换根dp初步大学习总结
  • 【deepseek】RT-Thread 为什么延迟好,但是吞吐量低
  • 基于python的养老院健康跟踪系统分析系统(源码+lw+部署文档+讲解等)
  • AI产品经理实战教程(非常详细),从0到1打造第一个智能体!
  • 基于python的贫困生资助管理系统(源码+lw+部署文档+讲解等)
  • 【deepseek 学习】RT-Thread 简介
  • 20260205_185752_手把手带做_Agent_智能体,直接让你简历加大分!
  • 数据立方体与联邦学习:隐私保护分析方案
  • 【deepseek】多任务调度详解
  • 为什么有人刷了3遍真题还是考不过?说说高项备考的“虚假努力“陷阱
  • Hadoop在大数据领域的工业数据分析应用
  • 特价股票与公司跨界数字化协同创新能力的关系研究
  • 20260205_190119_智能体框架:11_个顶级_AI_Agent_框架!
  • 电磁波传输过程中电磁能量如何流动、存储和转化?——坡印廷方程(一)
  • 【毕业设计】基于Python的商场停车管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • CentOS 6-9哪个版本最稳定?一篇读懂,避免踩坑!
  • 保姆级教程:多台SSH与宝塔面板统一管理搭建,运维效率翻倍
  • 以下因素是双膜储气柜寿命长久的充分条件
  • 基于Python+Django的校园二手物品交易系统(源码+lw+部署文档+讲解等)
  • 我烧了上亿token玩Clawdbot,结果发现国产平替更香,还免费。
  • 从理论到实践:AI视频生成的完整开发流程
  • planning十年演进
  • 基于Python+Django的协同过滤算法在线教育平台的设计与实现(源码+lw+部署文档+讲解等)
  • 如何部署POE交换机?自动模式怎样设置?