一定要看的前端codeReview规范指南
一、前言
针对目录结构、CSS规范、JavaScript规范、Vue规范
可参照官方给出的 风格指南
这里主要总结业务开发中常遇到的代码问题和实践,帮助大家后续各自做好codeReview,一些你遇到的典型问题,也可以在留言区评论,帮助团队共同进步。
二、实践规范
2.1 防止重复提交
--表单提交或者编辑新增数据时,按钮必须加loading,防止重复提交
<el-button type="primary" :loading="submitLoading" @click="handleSubmit"> 提交 </el-button>
--针对table的操作列中的操作项,没有二次确认的也要注意加loading
[图片]
<yun-table
:pagination="pagination"
:border="true"
:columns="columns"
:loading="loading"
:data="tableData"
@update:pagination="handlePageUpdate"
>
<template #action="{ row }">
<yun-rest>
<el-button
:loading="row.loadingSync"
type="action"
@click="handleAction(row, 'sync')"
>
同步
</el-button>
</yun-rest>
</template>
</yun-table>
...
<script setup>
const { result } = await fetchApi(data);
if (result) {
tableData.value = result.records.map((item) => {
return {
...item,
loadingSync: false,
};
});
total.value = result.total;
}
</script>
2.2 滚动到报错位置
--长表单页面或抽屉内容很长,点击提交时,有验证错误时,页面需要做好滚动到报错位置
const handleSubmit = async () => {
let flag = true;
formRef.value.elForm.validate((valid, noValidObj) => {
flag = valid;
if (!valid) {
const errorArr = Object.keys(noValidObj).filter(
(key) => Array.isArray(noValidObj[key]) && noValidObj[key][0]?.field
);
contractFormRef.value.elForm.scrollToField(errorArr[0]); // 滚动到报错位置
}
});
if (!flag) {
ElMessage.warning("表单未填写完成!");
return;
}
// 走后续提交请求
submitLoading.value = true;
...
2.3 模板上的多个判断条件,写成方法或者computed
<template>
// bad
<el-button
v-if="
['NORMAL', 'UNUSUAL'].includes(row.archiveType) &&
['ALREADY_SEND'].includes(row.contractStatus) &&
['ENABLED'].includes(row.enabledStatus)
"
type="action"
@click="handleAction(row, 'modify')"
>
变更
</el-button>
<el-button
v-if="
['NORMAL', 'UNUSUAL'].includes(row.archiveType) &&
['ALREADY_SEND'].includes(row.contractStatus) &&
['ENABLED'].includes(row.enabledStatus)
"
type="action"
@click="handleAction(row, 'renewal')"
>
续签
</el-button>
<el-button
v-if="
['NORMAL', 'UNUSUAL'].includes(row.archiveType) &&
['ALREADY_SEND'].includes(row.contractStatus) &&
['ENABLED'].includes(row.enabledStatus)
"
type="action"
@click="handleAction(row, 'rebook')"
>
改签
</el-button>
// good
<el-button
v-if="isChangeAvailiable(row)"
type="action"
@click="handleAction(row, 'modify')"
>
变更
</el-button>
<el-button
v-if="isChangeAvailiable(row)"
type="action"
@click="handleAction(row, 'renewal')"
>
续签
</el-button>
<el-button
v-if="isChangeAvailiable(row)"
type="action"
@click="handleAction(row, 'rebook')"
>
改签
</el-button>
</template>
<script setup>
// good
const isChangeAvailiable = (row) => {
return (
["ALREADY_SEND", "ALREADY_ARCHIVE"].includes(row.contractStatus) &&
["ENABLED"].includes(row.enabledStatus)
);
};
</script>
2.4 保持数据响应式
<script setup>
import { reactive } from "vue";
let state = reactive({
loading: false,
a: true,
});
function handleChange(){
// bad 无法实现数据响应式
state = {...state,b:'test'}
// bad 无法实现数据响应式
state = reactive({...state,b:'test'})
// correct 数据具有响应式
state.b = 'test';
// correct 数据具有响应式
Object.assign(state,{b:'test'});
}
</script>
2.5 避免使用 delete
delete 操作符并不会释放内存,而且会使得附加到对象上的 hidden class 失效,让对象变成 slow object。(hidden class 是 V8 为了优化属性访问时间而创建的隐藏类)
2.6 尽量使用 export 而 不是 export default 来导出
export default 有两个问题:1)不利于 tree shaking 2)如果使用了一个导出对象上不存在的属性,要运行时才能发现。
2.7 可选链访问数组元素
<template>
// bad
<span>{{row[0].contract.name}}<span>
<span>{{Array.isArray(row) && row[0].contract.name}}<span>
// good
<span>{{row?.[0]?.contract?.name}}<span>
</template>
2.8 参数硬编码
// bad 硬编码1001
const isActive = this.$route.query.id === '1001'
// good 写到配置信息中。这样,id和状态的对应关系一目了然,便于管理和维护。
const idConfig = {
1001: STATUS.ACTIVE
}
const isActive = idConfig[this.$route.query.id] === STATUS.ACTIVE
2.9 定时器是否及时清理
mounted () {
this.timer = setInterval(() => {
doSomething();
}, 300)
}
destroyed () {
if (this.timer) {
clearInterval(this.timer)
}
}
2.10 监听事件是否有解绑
在window/body 上的事件需要解绑:
mounted() {
window.addEventListener(‘resize’, this.func)
window.addEventListener(‘scroll’, this.func)
}
beforeDestroy () {
window.removeEventListener('resize', this.func);
window.removeEventListener('scroll', this.func);
}
三、总结
不积跬步,无以至千里。肯定还有很多遗漏的点,欢迎补充哟。
一定要看的前端codeReview规范指南的更多相关文章
- Web前端开发规范文档(google规范)
(Xee:其实没什么规范约束,但是养成一种好习惯,何乐而不为?) 区分大小写 xhtml 区分大小写,xhtml要求 标签名 属性名 值都要小写,并且要有双引号和 标签闭合. css 元素名称以及i ...
- 现代前端库开发指南系列(二):使用 webpack 构建一个库
前言 在前文中,我说过本系列文章的受众是在现代前端体系下能够熟练编写业务代码的同学,因此本文在介绍 webpack 配置时,仅提及构建一个库所特有的配置,其余配置请参考 webpack 官方文档. 输 ...
- 前端编码规范之JavaScript
上次浅谈了下关于CSS的编码规范,大部分童鞋持赞同意见,仍存在一些童鞋不太理解这些规范的意义. 如果是个人或者小作坊开发,其实这些所谓的编码规范也没啥意思,因为大家写好的代码直接就给扔到网上去了,很少 ...
- 常用html、CSS、javascript前端命名规范
无论是从技术角度还是开发视角,对于web前端开发规范文档都有一定规范,本文就css3和html5的发展前景总结了一系列的web开发文档,仅供大家参考. 规范目的: 为提高团队协作效率, 便于后台人员添 ...
- 移动H5前端性能优化指南
移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...
- web前端性能优化指南(转)
web前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网络 ...
- 移动H5前端性能优化指南(转载)
移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...
- WEB前端开发规范
WEB前端开发规范 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档.本文档如有不对或者不合适的地方请及时提出, 经讨论决定后方可更改. 基本 ...
- 前端编码规范(4)—— CSS 和 Sass (SCSS) 规范
CSS and Sass (SCSS) style rules ID and class naming ID和class(类)名总是使用可以反应元素目的和用途的名称,或其他通用名称.代替表象和晦涩难懂 ...
- 前端编码规范(2)—— HTML 规范
HTML 规范 文档类型 推荐使用 HTML5 的文档类型申明: <!DOCTYPE html>. (建议使用 text/html 格式的 HTML.避免使用 XHTML.XHTML 以及 ...
随机推荐
- 机器学习基础05DAY
分类算法之k-近邻 k-近邻算法采用测量不同特征值之间的距离来进行分类 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 一个例子弄懂k-近 ...
- 使用nw.js打包以后的web项目 发布客户端
一.下载nw.js 直接前往官网下载即可 https://nwjs.io/downloads/ 二.封装最简单的客户端 nw.js下载完成后,在任意位置新建文件夹,例如nwtest,然后在文件夹中新建 ...
- Go 语言:通过TDD驱动开发创建一个 Web 服务器,用户可以在其中跟踪玩家赢了多少场游戏。
你被要求创建一个 Web 服务器,用户可以在其中跟踪玩家赢了多少场游戏. GET /players/{name} 应该返回一个表示获胜总数的数字 POST /players/{name} 应该为玩 ...
- Linux线程同步必知,常用方法揭秘!
一.为什么要线程同步 在Linux 多线程编程中,线程同步是一个非常重要的问题.如果线程之间没有正确地同步,就会导致程序出现一些意外的问题,例如: 竞态条件(Race Condition):多个线程同 ...
- Let's Encrypt 泛域名证书申请
泛域名 泛域名证书又名通配符证书是SSL证书中的其中一种形式,一般会以通配符的形式(如:*.domain.com)来指定证书所要保护的域名. OV证书和DV证书都会有通配符的域名形式提供,而EV证书一 ...
- [Linux]常用命令之【netstat/ps/lsof/ss/kill/】#进程/服务/端口#
查看系统中最近的端口连接记录 [root@sdc01 ~]# lsof -Pnl +M -i4 | grep "154" sshd 30963 0 3u IPv4 65160732 ...
- 什么是BFC,BFC的作用,以及怎么触发BFC
什么是BFC: 块级格式化上下文 BFC的作用: BFC其实就是规定了网页布局的规范 1.BFC就是页面上的一个独立容器,容器里面的元素不会影响到外面的元素 解释:BFC的基本改变,最 ...
- django渲染模版时比实际少了8小时?
这是因为django的时间是UTC时间. 我们通过改配置文件将其改成本地时间 修改配置文件 # 将时间从UTC转化成当前时间 TIME_ZONE = 'Asia/Shanghai' # USE_TZ ...
- spring boot过滤器实现项目内接口过滤
spring boot过滤器实现项目内接口过滤 业务 由于业务需求,存在两套项目,一套是路由中心,一套是业务系统. 现在存在问题是,路由中心集成了微信公众号与小程序模块功能,业务系统部署了多套服务. ...
- 第三方接口调用httpUtils
1.GET 请求 public static JSONObject getHttpGetResp(String url, String authorization, String title) { H ...