一、前言

针对目录结构、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规范指南的更多相关文章

  1. Web前端开发规范文档(google规范)

    (Xee:其实没什么规范约束,但是养成一种好习惯,何乐而不为?) 区分大小写 xhtml  区分大小写,xhtml要求 标签名 属性名 值都要小写,并且要有双引号和 标签闭合. css 元素名称以及i ...

  2. 现代前端库开发指南系列(二):使用 webpack 构建一个库

    前言 在前文中,我说过本系列文章的受众是在现代前端体系下能够熟练编写业务代码的同学,因此本文在介绍 webpack 配置时,仅提及构建一个库所特有的配置,其余配置请参考 webpack 官方文档. 输 ...

  3. 前端编码规范之JavaScript

    上次浅谈了下关于CSS的编码规范,大部分童鞋持赞同意见,仍存在一些童鞋不太理解这些规范的意义. 如果是个人或者小作坊开发,其实这些所谓的编码规范也没啥意思,因为大家写好的代码直接就给扔到网上去了,很少 ...

  4. 常用html、CSS、javascript前端命名规范

    无论是从技术角度还是开发视角,对于web前端开发规范文档都有一定规范,本文就css3和html5的发展前景总结了一系列的web开发文档,仅供大家参考. 规范目的: 为提高团队协作效率, 便于后台人员添 ...

  5. 移动H5前端性能优化指南

    移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...

  6. web前端性能优化指南(转)

    web前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网络 ...

  7. 移动H5前端性能优化指南(转载)

    移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网 ...

  8. WEB前端开发规范

    WEB前端开发规范 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档.本文档如有不对或者不合适的地方请及时提出, 经讨论决定后方可更改. 基本 ...

  9. 前端编码规范(4)—— CSS 和 Sass (SCSS) 规范

    CSS and Sass (SCSS) style rules ID and class naming ID和class(类)名总是使用可以反应元素目的和用途的名称,或其他通用名称.代替表象和晦涩难懂 ...

  10. 前端编码规范(2)—— HTML 规范

    HTML 规范 文档类型 推荐使用 HTML5 的文档类型申明: <!DOCTYPE html>. (建议使用 text/html 格式的 HTML.避免使用 XHTML.XHTML 以及 ...

随机推荐

  1. 谷歌浏览器配置Selenium,并配合python使用

    python环境准备 python 需要安装selenium ,这个直接pip安装即可 pip install selenium -i http://pypi.douban.com/simple -- ...

  2. requests不带参数的get请求和带get参数请求

    requests库常用的方法 requests.Request(url) 构造一个请求,支持以下各种方式 requests.get() 发送get请求 requests.post() 发送post请求 ...

  3. [C++STL教程]6.bitset是什么?和bool有什么区别?零基础都能看懂的入门教程

    之前我们介绍过vector, queue, stack,map,set,今天我们介绍另外一个stl容器:bitset. 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通 ...

  4. Docker 容器上部署 Zabbix

    首先,从 Docker Hub 上拉取 Zabbix 镜像.可以使用以下命令: docker pull zabbix/zabbix-server-mysql:latest 这会下载最新版本的 Zabb ...

  5. 垃圾回收之三色标记法(Tri-color Marking)

    关于垃圾回收算法,基本就是那么几种:标记-清除.标记-复制.标记-整理.在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率. 无论使用哪种算法,标记总是必要的 ...

  6. app稳定性测试-iOS篇

    稳定性测试:测试应用程序在长时间运行过程中是否存在内存泄漏.崩溃等问题,以确保应用程序具有较高的稳定性和可靠性. 对于安卓端,官方提供了很好的稳定性测试工具:monkey. 相比较而言,iOS则没有, ...

  7. Vue3中无法为el-tree-select设置反选问题分析

    好久没有写博客了,刚好上周遇到一个难缠问题,这里记录一下. 环境:Vue3.2.Element Plus 问题:子组件 setting.vue => 弹窗组件 Dialog => 树选择组 ...

  8. SpringBoot 缓存注解的使用

    最近比较忙,没时间更新了.上一篇文章我说了如何使用Redis做缓存,文末我稍微提到了SpringBoot对缓存的支持.本篇文章就针对SpringBoot说一下如何使用. 1.SpringBoot对缓存 ...

  9. C#模拟C++模板特化对类型的值的支持

    概述 C++的模板相比于C#,有很多地方都更加的灵活(虽然代价是降低了编译速度),比如C++支持变长参数模板.支持枚举.int等类型的值作为模板参数. C++支持枚举.int等类型的值作为模板参数,为 ...

  10. Ubuntu-管理开机自启动服务

    1. 管理服务启停工具 systemctl -- 将应用程序抽象为一个service,然后对这个service进行创建.启停.状态查看.配合journalctl进行日志管理 子命令 效果 start ...