简化 vue 代码中大量 if 操作

当我们在 vue 项目中可能出现以下场景:

javascript 复制代码
export enum OperationEnum {
  '详情' = 1,
  '分配' = 2,
  '邀请入驻' = 3,
  '合同签约' = 4,
  '撤销签约' = 5,
  '申请上线' = 6,
}
javascript 复制代码
const operation = (param) => {
  if (param.operationType === OperationEnum.详情) {
    routeDetailDialogRef.value.openDialog({
      clueId: param.rowId.clueId,
    });
  }
  if (param.operationType === OperationEnum.分配) {
    routeOperationDialogRef.value.openDialog({
      clueId: param.rowId.row.clueId,
      dialogType: param.rowId.type,
    });
  }
  if (param.operationType === OperationEnum.邀请入驻) {
    inviteSettleDialogRef.value.openDialog({
      clueId: param.rowId.clueId,
    });
  }
  if (param.operationType === OperationEnum.合同签约) {
    contractSignDialogRef.value.openDialog({
      clueId: param.rowId.clueId,
    });
  }
  if (param.operationType === OperationEnum.撤销签约) {
    revokeContractDialogRef.value.openDialog({
      clueId: param.rowId.clueId,
    });
  }
  if (param.operationType === OperationEnum.申请上线) {
    confirmOnlineDialogRef.value.openDialog({
      clueId: param.rowId.clueId,
    });
  }
};

存在一个对应的枚举值,一个根据传入参数执行的函数,大量的 if 判断让代码变得很繁琐,也不利于后期维护。

有一个简单的处理方法如下:

javascript 复制代码
const operation = (param) => {
  const HandleMap = {
    [OperationEnum.详情]: {
      callback: () => {
        routeDetailDialogRef.value.openDialog({
          clueId: param.rowId.clueId,
        });
      },
    },
    [OperationEnum.分配]: {
      callback: () => {
        routeOperationDialogRef.value.openDialog({
          clueId: param.rowId.row.clueId,
          dialogType: param.rowId.type,
        });
      },
    },
    [OperationEnum.邀请入驻]: {
      callback: () => {
        inviteSettleDialogRef.value.openDialog({
          clueId: param.rowId.clueId,
        });
      },
    },
    [OperationEnum.合同签约]: {
      callback: () => {
        contractSignDialogRef.value.openDialog({
          clueId: param.rowId.clueId,
        });
      },
    },
    [OperationEnum.撤销签约]: {
      callback: () => {
        revokeContractDialogRef.value.openDialog({
          clueId: param.rowId.clueId,
        });
      },
    },
    [OperationEnum.申请上线]: {
      callback: () => {
        confirmOnlineDialogRef.value.openDialog({
          clueId: param.rowId.clueId,
        });
      },
    },
  };
  const target = HandleMap[param.operationType];
  target?.callback();
};

修改后的代码,更加方便后期维护,如果有更多的枚举值,继续往下写就好。之后遇到类似的代码都可以使用该方法进行完善。

相关推荐
前端之虎陈随易5 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·vue.js·人工智能·typescript·node.js
一路向北he5 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
kyriewen6 小时前
豆包和千问同时关了智能体,我用它们搭的 3 个自动化全废了——迁移方案整理
前端·javascript·ai编程
前端一小卒6 小时前
我用 TypeScript 从零手写了一个 Claude Code,然后发现它的核心只有 30 行
前端·agent
铁皮饭盒6 小时前
用 Bun.cron 定时 7 月 7 日,为啥? 看图1
javascript
大圣编程8 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
yuhaiqiang8 小时前
随手 vibecoding 的浏览器插件已经 6000 多次下载,聊聊他的产品设计
前端·后端·面试
格子软件8 小时前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
之歆8 小时前
Vue商品详情与放大镜组件
前端·javascript·vue.js
再吃一根胡萝卜9 小时前
如何把小米 MiMo 接入 CodeBuddy,打造私有 Agent
前端