Vue前端枚举的实现

人生若只如初见,便是虚伪又热情

代码放在https://gitee.com/siumu/blog_code.git
  我们在后端总是用枚举来定义一些不变的数据,但是前端怎么实现枚举这种东西呢?我也是参考网上的各种方案,整理出来一种简单易懂,感觉应该还可以用的方案。
我们就以性别枚举为例,写一个出来,在后端性别枚举是这样定义的:

/**
 * 性别枚举
 */
@Getter
public enum Gender {

    UNKNOWN(0, "未知"),
    MALE(1, "男"),
    FEMALE(2, "女");

    Gender(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    @JsonValue
    @EnumValue
    private final Integer code;

    private final String desc;  
}

在前端是这样定义的

// 判断是不是一个函数
import { isFunction } from '@/utils/validate'

/**
 * 性别枚举
 * 未知
 * 男
 * 女
 */
const GenderEnum = {

    UNKNOWN: {
        label: '未知',
        value: 0
    },
    MALE: {
        label: '男',
        value: 1
    },
    FEMALE: {
        label: '女',
        value: 2
    },

    /**
     * 获取所有的枚举,排除函数
     * @return {*[]}枚举数组
     */
    allEnums() {
        let enums = []
        for (let key in GenderEnum) {
            if (!isFunction(GenderEnum[key])) {
                enums.push(GenderEnum[key])
            }
        }
        return enums
    },
    /**
     * 根据 label 获取 枚举
     * @param label label
     * @return {*} 对应的枚举
     */
    getEnumByLabel(label) {
        for (let key in GenderEnum) {
            if (GenderEnum[key].label === label) {
                return GenderEnum[key]
            }
        }
        return {}
    },

    /**
     * 根据 label 获取 枚举
     * @param value value
     * @return {*} 对应的枚举
     */
    getEnumByValue(value) {
        for (let key in GenderEnum) {
            if (GenderEnum[key].value === value) {
                return GenderEnum[key]
            }
        }
        return {}
    }
}
// 设置当前对象只读
Object.freeze(GenderEnum)
export default GenderEnum

枚举应用

这个枚举怎么使用呢?

<template>
<div class="ml-2em">
  <h1>前端枚举的实现:</h1>
  <div class="is-flex el-row--flex">
    <el-select v-model="gender" clearable>
      <el-option v-for="(item,index) in GenderEnum.allEnums()" :key="index" :value="item.value" :label="item.label" />
    </el-select>
    <p class="ml-2em">
      <span>选中的值:value = </span>
      <span style="color: red">{{gender}}</span>
      <span class="ml-2em">label = </span>
      <span class="el-button--text">{{ GenderEnum.getEnumByValue(gender).label }}</span>
    </p>
  </div>
</div>
</template>
<script>
import GenderEnum from "@/enums/GenderEnum";
export default {
  name: "index",
  data(){
    return {
      gender: null,
      GenderEnum
    }
  }
}
</script>

代码放在https://gitee.com/siumu/blog_code.git

<think>好的,我现在需要帮助用户在Vue3项目中实现扫码识别功能。首先,我得回顾一下用户提供的参考资料。他们提到在微信和原生浏览器中调用摄像头扫描二维码,并且有相关的代码示例,比如使用wx.scanQRCode的API。用户现在想在Vue3中实现类似的功能,需要教程和示例代码。 首先,我得确定用户可能需要的两种场景:一种是在微信环境中使用微信JS-SDK,另一种是在普通浏览器中使用HTML5的API。因为用户提供的引用中有微信相关的代码,所以需要涵盖这两种情况。 接下来,我需要考虑Vue3的项目结构,如何集成扫码功能。对于微信的情况,可能需要引入微信的JS-SDK,并且进行配置,比如通过后端接口获取签名等信息。而对于普通浏览器,可能需要使用类似html5-qrcode这样的第三方库,它基于MediaDevices API访问摄像头。 然后,需要处理不同浏览器的兼容性问题,比如在微信内置浏览器中可能需要特定的权限处理,而在其他浏览器中可能需要用户手动允许摄像头访问。此外,扫码成功后的回调函数如何处理,比如解析结果后跳转页面或显示信息。 还要考虑代码示例的结构,确保在Vue3的setup语法糖中使用,比如使用ref来管理状态,生命周期钩子中处理权限的释放。同时,需要提示用户注意安全性和权限问题,比如HTTPS的要求,用户授权提示等。 最后,生成相关问题,可能涉及性能优化、兼容性处理、错误处理等方面,确保用户能进一步了解相关知识点。</think>### Vue3实现扫码识别功能教程 #### 一、技术选型分析 1. **微信环境**:使用微信JS-SDK的`wx.scanQRCode`接口实现扫码[^2] 2. **普通浏览器**:采用HTML5的`MediaDevices API`配合第三方库如`html5-qrcode` 3. **跨平台方案**:推荐使用`vue-qrcode-reader`组件库 #### 二、微信环境实现方案 ```javascript // 安装SDK npm install weixin-js-sdk // Vue组件 <script setup> import { onMounted } from 'vue' const initWechatSDK = async () => { // 通过后端获取签名配置 const { data } = await axios.get('/api/wechat-signature') wx.config({ debug: false, appId: data.appId, timestamp: data.timestamp, nonceStr: data.nonceStr, signature: data.signature, jsApiList: ['scanQRCode'] }) } const scanQRCode = () => { wx.scanQRCode({ needResult: 1, scanType: ["qrCode"], success: (res) => { const result = res.resultStr.split(',')[1] window.location.href = result } }) } onMounted(initWechatSDK) </script> ``` #### 三、普通浏览器实现方案 ```javascript // 安装依赖 npm install html5-qrcode // 组件实现 <template> <div id="qr-reader"></div> <button @click="stopScan">停止扫描</button> </template> <script setup> import { onMounted, ref } from 'vue' import { Html5Qrcode } from "html5-qrcode" const html5QrCode = ref(null) onMounted(() => { startScan() }) const startScan = async () => { html5QrCode.value = new Html5Qrcode("qr-reader") try { await html5QrCode.value.start( { facingMode: "environment" }, { fps: 10 }, onScanSuccess ) } catch (err) { console.error("摄像头访问失败:", err) } } const onScanSuccess = (decodedText) => { console.log("识别结果:", decodedText) // 处理跳转或显示结果 } const stopScan = () => { html5QrCode.value.stop() } </script> ``` #### 四、注意事项 1. **HTTPS要求**:摄像头访问需要HTTPS环境[^1] 2. **权限处理**:需处理用户拒绝摄像头访问的情况 3. **移动端适配**:建议添加全屏遮罩层优化移动端体验 4. **错误处理**:需捕获设备枚举、摄像头中断等异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值