CodeReview 中最容易被吐槽的 7 个点!!!

常量提取
请看如下代码,可能很多人都是这么写代码的,在页面中疯狂的去使用常量,而且非常分散,这样做的坏处就是,你以后维护的成本非常高,你得到处找,然后去修改。非常累~

setTimeout(() => {
 // coding
}, 10 * 1000);

this.http.get('/api/v1/xxxxxx');

localStorage.setItem('token', 'xxxxxx')
最好就是一个模块有一个 constants.js 文件,用来统一存放此模块的一些常量,并且要使用大驼峰命名去定义,千万不要嫌麻烦!

// constants.js

const TIME_OUT = 10 * 1000;
const REQUEST_URL = '/api/v1/xxxxxx';
const TOKEN_KEY = 'token'
合理使用 enum
我们来看下面一段代码,比如一个页面中有大量的判断,且其实条件都是一样的,比如:

if (role === 1) {
  // coding
}
// .....
if (role === 2) {
  // coding
}
// .....
if (role === 1) {
  // coding
}
// .....
if (role === 2) {
  // coding
}
很多人会直接把 1,2写到页面中,其实这样不利于维护,你想想如果以后role改了标准,那你不是得全局去修改,那万一要是改漏了咋办?所以可以使用enum去解决这个问题,我建议一个模块应该都要有一个types.ts文件,用来存放此模块的ts类型。这样我们以后修改只需要改一处即可~

// types.ts
export enum RoleType {
  Admin = 1,
  SuperAdmin = 2
}

// page
if (role === RoleType.Admin) {
  // coding
}
// .....
if (role === RoleType.SuperAdmin) {
  // coding
}
个人信息加密
大家通常会在登录后把个人信息存放在LocalStorage中,且是明文的。。。这其实是有很大的安全隐患的,假如被别有用心的人直接编辑修改,那会造成伪造权限进行操作的现象

http.post('/api/v1/login', params, (userInfo) => {
  localStorage.setItem('userInfo', userInfo)
})
我们应该对存储的个人信息进行加密,并且也需要在取值时进行解密

const USER_INFO_KEY = 'userInfo'


class UserInfoStroage {
  tasks: Record<> = {}
  get(key) {
    // 解密取值
  }
  set(value) {
    // 加密存储
    // 执行tasks
  }
  clear() {
    // 清除
  }
  subscribe(key, cb) {
    // 事件订阅,监听变化
    tasks[key] = cb
  }
}

export const uis = new UserInfoStroage()
这个事件订阅挺重要的,我们可能需要监听userInfo变化时去执行一些函数,就可以在这里进行订阅~

多传对象参数
很多人在写一个函数的时候,喜欢这么去定义

const fn = ({
  name,
  age,
  sex = '女'
}) => {
  // coding
}
其实这样定义函数,有时候让后面的开发者非常头疼,如果人家要拓展参数,那就得一定把前面的参数给传了才行,这样非常不利于维护,所以还是建议使用对象的传参形式,这样做的好处就是拓展性强,且你想传哪个就哪个,没必要因为其他参数而影响你想真正传的参数

const fn = (name, age, sex = '女') => {
  // coding
}
多用数据驱动视图
我看到一段代码,在模板中的代码,大概是这样的,大概就是渲染一个表格的数据

<tr>名称<tr>
<tr>性别<tr>
<tr>年龄<tr>

<tbody>
  <div v-for="let item of list">
    <td>{{ item.name }}</td>
    <td>{{ item.sex }}</td>
    <td>{{ item.age }}</td>
  </div>
</tbody>
其实我想说,框架具备数据驱动视图的能力,我们就应该去充分利用它,这样也比较方便维护啊,以后修改数据只需要在数据层去修改,而不用去过多关注视图层

// 数据层
colums = [
  {
    name: '名称',
    field: 'name'
  },
  {
    name: '性别',
    field: 'sex'
  },
  {
    name: '年龄',
    field: 'age'
  }
]
list = [.....]

// 视图层
<tr v-for="let column of colums">
  {{ column.name }}
</tr>

<tbody>
  <div v-for="let item of list">
    <td v-for="let column of colums">
      {{ item[column.field] }}
    </td>
  </div>
</tbody>
不要过多在模板中做逻辑
经常在模板中看到很多判断逻辑,分为多种情况

列表判断某些行不显示
权限判断某些节点不显示
<div v-for="let o of list" v-if="index === 1"></div>

<button v-if="role === 1 && name === 'xxx'"></button>
我想说,还是多把这些判断放在数据层处理,不要过多在视图层里去做逻辑判断,不然后期维护非常麻烦

// 数据层
const computedList = computed(() => {
  return list.filter((item) => 条件判断)
})
const showButton = computed(() => {
  return role === 1 && name === 'xxx'
})

// 视图层
<div v-for="let o of computedList" v-if="index === 1"></div>

<button v-if="showButton"></button>
不要用拼音去命名
不要用拼音,或者拼音缩写去命名,最好是使用英文驼峰去命名~



作者:前端开发爱好者


欢迎关注微信公众号 :前端开发爱好者