本次代码评审的项目是“天天访客小程序”。评审内容是代码规范问题,没有涉及复杂逻辑。
评审总结
问题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.groupNamethis.formInfo = formInfo.formGroup
问题8:promise方法,没有使用async await 方式来调用
- 推荐使用async await 方式来调用,减少嵌套
- 推荐使用箭头函数,确保this作用域
// 优化之前scanCode() {// 允许从相机和相册扫码const that = thisuni.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 = falsesetTimeout(() => {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}
