前端多种深嵌套以及解决方案

796 阅读3分钟

我的位置:ljn1998codeing.love

前言

在这个月我们部门接了另一个部门的一个项目,在拿到代码的那一刻开始我就想说 好家伙,这个项目是两个项目融合在一起。下面我先说说这个项目中存在的问题:

  • 项目中使用多个UI组件库,elementantd-vue。所遇到的问题是两个组件库部门组建功能和方法冲突,例如 Messageconfirm方法,前一个组件会覆盖后面的组件导致方法调用错误。
  • 代码嵌套太深(这里指超过4层),导致可读性差、可维护性差等等问题。
  • 代码中没必要的注释多,例如一页代码500行,中间一大段代码被注释掉并无写明原因。所以这段注释的代码删了又怕他用到,不删又碍眼。
  • 代码命名不规范(感觉像临时工),a1、a2、b1、b2这种命名。

解决方法

问题一(多组件库冲突)

原代码中 elementantd-vue的引入方式都是全局引入,直接在 main.js 中全局 use,因此会造成后面组件库的方法覆盖掉前面组件库同名的方法。

我的解决方法是将 antd-vue 按需引入

// 安装 babel-plugin-import
yarn add babel-plugin-import -D

// 配置 babel.config.js
module.exports = {
  presets: ["@vue/app"],
  plugins: [
    [
      "import",
      { libraryName: "ant-design-vue", libraryDirectory: "es", style: 'css' },
    ],
  ],
};
// 创建 antdUIConfig.js,在这里把antd-vue所有的组件不包括 Message、Confirm引入进来
// 最后在main.js中运行该文件即可解决UI组件库冲突

问题二(代码深嵌套)

回调地狱

getData1(data1 => {
    getData2(data2 => {
        getData3(data3 => {
            getData4(data4 => {
                getData5(data5 => {
                    do(data1, data2, data3, data4, data5)
                })
            })
        })
    })
})
解决方法

Promise

Promise 改写代码,串行异步链式调用

let data1, daat2, data3, data4, data5;

getData1().then(data => {
    data1 = data;
    return getData2();
}).then(data => {
    data2 = data;
    return getData3();
}).then(data => {
    data3 = data;
    return getData4();
}).then(data => {
    data4 = data;
    return getData5();
}).then(data => {
    data5 = data;
    do(data1, daat2, data3, data4, data5);
})

但是要注意上面 getData 这些方法返回值必须是 Promise

还可以这样做

Promise.all([getData1, getData2, getData3, getData4, getData5])
.then(([data1, daat2, data3, data4, data5]) => {
    do(data1, daat2, data3, data4, data5)
})

async/await

使用 async/await 来操作让代码可读性更强

async getAllData() {
    let data1 = await this.getData1();
    let data2 = await this.getData2();
    let data3 = await this.getData3();
    let data4 = await this.getData4();
    let data5 = await this.getData5();
    do(data1, daat2, data3, data4, data5);
}

多if嵌套

多条件判断 if-else-if

const clickHandler = (status) => {
  if(status === 1) {
    do1()
  } else if(status === 2) {
    do2()
  } else if(status === 3) {
    do3()
  } else if(status === 4) {
    do4()
  } else if(status === 5) {
    do5()
  } else {
    do()
  }
}
解决方法

switch 使用 switch 优化比 if-else-if清晰多了,可读性更强

const clickHandler = (status) => {
  switch (status) {
    case 1:
      do1();
      break;
    case 2:
      do2();
      break;
    case 3:
      do3()
      break;
    case 4:
      do4();
      break;
    case 5:
      do5();
      break;
    default:
      do();
      break;
  }
}

问题三、问题四(冗余注释、命名不规范)

对于这个问题就是真的头疼了,我的方法是,慢慢review代码并且一点一点修改(最费力的方法)。这也是没办法的办法了,要不然组内成员协同开发时组内成员搞不明白,或者照做可就麻烦了🤦‍♂️

最后

对于代码规范要求不严格的公司来说,接手别人的代码真的是很难的一件事,如果不加以约束,就真的慢慢成为💩山。前人挖坑后人跳。

所以各位小伙伴们在开发时尽量规范些

最后祝各位生活愉快😊