import { ref, onMounted, onUnmounted, onShow } from 'vue' import { useInit, useGlobalEvent, updateActivePageOnShow, cleanupOnPageUnload } from '@/utils/useBarcodeModule.js' /** * Vue3 Composable - 条码扫描 * @param {Object} options 配置选项 * @param {Function} options.onScan 扫描成功回调 * @param {Function} options.onError 扫描失败回调 * @param {boolean} options.autoInit 是否自动初始化 */ export function useBarcode(options = {}) { const { onScan, onError, autoInit = false } = options // 响应式状态 const isScanning = ref(false) const isInitialized = ref(false) const scanResult = ref(null) const scanHistory = ref([]) const error = ref(null) // 内部状态 let removeListener = null /** * 初始化扫描器 */ const init = async () => { try { if (isInitialized.value) { console.warn('扫描器已经初始化') return true } useInit() isInitialized.value = true error.value = null console.log('扫描器初始化成功') return true } catch (err) { error.value = err if (onError) { onError(err) } console.error('扫描器初始化失败:', err) return false } } /** * 开始扫描 */ const startScan = async () => { try { // 确保扫描器已初始化 if (!isInitialized.value) { const success = await init() if (!success) return false } if (isScanning.value) { console.warn('扫描器已经在运行中') return true } // 注册扫描事件监听 removeListener = useGlobalEvent(handleScanResult) isScanning.value = true error.value = null console.log('开始扫描监听') return true } catch (err) { error.value = err if (onError) { onError(err) } console.error('开始扫描失败:', err) return false } } /** * 停止扫描 */ const stopScan = () => { try { if (removeListener) { removeListener() removeListener = null } isScanning.value = false console.log('停止扫描监听') return true } catch (err) { error.value = err if (onError) { onError(err) } console.error('停止扫描失败:', err) return false } } /** * 处理扫描结果 */ const handleScanResult = (result) => { try { console.log('收到扫描结果:', result) // 解析扫描结果 const barcode = result.barcode || result.data || result.code || String(result) const timestamp = new Date().toLocaleString() const scanData = { barcode, timestamp, rawData: result } // 更新状态 scanResult.value = scanData // 添加到历史记录 scanHistory.value.unshift(scanData) // 限制历史记录数量 if (scanHistory.value.length > 100) { scanHistory.value = scanHistory.value.slice(0, 100) } // 执行回调 if (onScan) { onScan(scanData) } error.value = null } catch (err) { error.value = err if (onError) { onError(err) } console.error('处理扫描结果失败:', err) } } /** * 清空扫描历史 */ const clearHistory = () => { scanHistory.value = [] scanResult.value = null } /** * 清理资源 */ const cleanup = () => { stopScan() cleanupOnPageUnload() } // 生命周期钩子 onMounted(() => { if (autoInit) { init() } }) onShow(() => { // 页面显示时更新活跃页面 updateActivePageOnShow() }) onUnmounted(() => { cleanup() }) // 返回API return { // 状态 isScanning, isInitialized, scanResult, scanHistory, error, // 方法 init, startScan, stopScan, clearHistory, cleanup } }