本次代码评审的项目是“天天访客小程序”。评审内容是代码规范问题,没有涉及复杂逻辑。
评审总结
问题1:命名规范
事件命名:handle + 动词 + 名词
接口命名:api + 动词 + 名词
错误示范:pullVisitorMP(不明确)、handleBtnCLick(单词拼写错误)、leaveModalShow(很奇怪)、handlePic(缺少动词)
正确示范:handleJumpFaceCollect、handleClickBtn、showLeaveModal、handleUploadPic
问题2:大部分三元运算符,可以转换为逻辑表达式
return item ? item.visitCount : 0 //优化之前
item?.visitCount || 0 //优化之后
this.showScore ? (this.showScore = false) : '' //优化之前
this.showScore && (this.showScore = false) //优化之后
问题3:在模板做太多逻辑的判断,用:style=”[headerStyles]”
:style="
!isGuide
? $consts.get('ARRIVE_STATUS').LEAVED !== detail.arriveStatus && info
? 'position: absolute; bottom: 96rpx;'
: 'position: absolute; bottom: -32rpx;'
: ''
"
问题4:console.log没有按照规范写
规范写法:console.log(TAG_NAME,’rolecode发生改变’)
roleCode(val, newVal) {
console.log('rolecode发生改变') // 优化之前
console.log(TAG_NAME,'rolecode发生改变') //优化之后
this.initButtons()
}
问题5:计算属性
技巧:定义后不再赋值
photoClarity: [
{
id: 0,
status: '人脸照片不合格,有遮挡',
color: '#E83838',
info: '人脸信息不通过,请重新上传'
},
{
id: 1,
status: '人脸模糊',
color: '#E83838',
info: '人脸信息不通过,请重新上传'
},
{
id: 2,
status: '人脸不完整',
color: '#E83838',
info: '人脸信息不通过,请重新上传'
},
{
id: 3,
status: '人脸匹配成功',
color: '#E83838',
info: '人脸信息通过,可进行绑定'
},
{
id: 4,
status: '人脸匹配成功',
color: '#01B3B7',
info: '人脸信息通过,可进行绑定'
}
],
问题6:清空默认参数、打印日志和注释的代码
默认参数应使用特殊值或在发布前清空,避免正式环境接口返回异常时导致页面上出现误导用户的错误数据
item: {
require: false,
default() {
return {
name: '吴银丽',
visitType: '商务洽谈',
enterDate: '2021/4/28 10:00',
leaveDate: '2021/4/28 10:00',
auditStatus: 0
}
}
}
问题7:在循环里直接对this进行操作
不建议在循环里对this进行操作,这样每循环一次,就会引起一次数据更新,推荐做法是通过map生成数组,然后统一再concat到this数组中,也可以使用piui封装的方法groupbyForm
// 优化之前
groups.forEach(groupItem => {
this.groupName.push(groupItem.groupName)
this.formInfo.push(groupItem.groupData.sort((a, b) => a.sort - b.sort))
})
// 优化之后 数组排序
const formInfo = this.$utils.common.groupbyForm(data.formInfo)
this.groupName = formInfo.groupName
this.formInfo = formInfo.formGroup
问题8:promise方法,没有使用async await 方式来调用
- 推荐使用async await 方式来调用,减少嵌套
- 推荐使用箭头函数,确保this作用域
// 优化之前
scanCode() {
// 允许从相机和相册扫码
const that = this
uni.scanCode({
success: function(res) {
const result = that.$utils.common.qrCode2Router(res.result)
if (result) {
that.$pi.navi.navigateTo(result.path, result.params)
} else {
that.$toast('无效二维码')
}
}
})
},
// 优化之后
async scanCode() {
let [, res] = await uni.scanCode()
if (res?.errMsg !== 'scanCode:ok') return // 非二维码
const result = this.$utils.common.qrCode2Router(res.result)
if (!result) return this.$toast('无效二维码')
this.$pi.navi.navigateTo(result.path, result.params)
}
问题9:内外变量名一致
// 优化之前
val.forEach(item => {
item.forEach(val => {})
})
// 优化之后
formGroup.forEach(formList => {
formList.forEach(formItem => {
form[formItem.code] = this.getFormValue(formItem)
rules[formItem.code] = this.$utils.common.getRuleItem(formItem)
})
})
问题10:字符串拼接
拼接地址,推荐使用[].join(‘-‘)
// 优化之前
let myPosition = country + '-' + province + '-' + city + '-' + district
// 优化之后
let myPosition = [country, province, city, district, street, streetNum, poiName].join('-')
问题11:可以通过ref调用子组件方法
// 优化之前
this.refresh = false
setTimeout(() => {
this.refresh = true
}, 50)
// 优化之后
handleDataRefresh() {
const currentList = this.$refs[this.currentItem.id]
currentList && currentList[0].refresh()
}
问题12:复杂逻辑 和 数字状态判断 没有注释说明
添加注释说明,为了自己过段时间忘记逻辑,也为了看代码的人更好的理解
// 优化之前
if (data.faceStatus === 3 || data.faceStatus === 4) {
// 上传用户人脸照片
this.handleUploadFacePic()
return
}
// 优化之后
//faceStatus 3 & 4 人脸信息通过,可进行绑定
if (data.faceStatus === 3 || data.faceStatus === 4) {
// 上传用户人脸照片
this.handleUploadFacePic()
return
}