一、前言

针对目录结构、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. CTF-NEFU校赛-题解

    Write by NEFUNSI: ghosin 0ERROR 签到 signin 下载 signin.txt 打开得到一串 base64,解码得到 flag{we1come_t0_NEFUCTF!} ...

  2. pandas之设置显示格式

    在用 Pandas 做数据分析的过程中,总需要打印数据分析的结果,如果数据体量较大就会存在输出内容不全(部分内容省略)或者换行错误等问题.Pandas 为了解决上述问题,允许你对数据显示格式进行设置. ...

  3. 深度学习之PyTorch实战(5)——对CrossEntropyLoss损失函数的理解与学习

    其实这个笔记起源于一个报错,报错内容也很简单,希望传入一个三维的tensor,但是得到了一个四维. RuntimeError: only batches of spatial targets supp ...

  4. Android View的事件分发机制-源码解析

    为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志: 然后把我们自定义的按钮加到主布局文件中: public clas ...

  5. Midjourney:一步一步教你如何使用 AI 绘画 MJ

    一步一步如何使用 Midjourney 教程:教学怎么用 MJ? 一.Midjourney(MJ)是什么? Midjourney是一款使用文字描述来生成高质量图像的AI绘画工具.这篇文章主要介绍了Mi ...

  6. 前端获取不到环境变量NODE_ENV

    有时候我们期望通过执行不同的 npm script 来区分诸如 dev.prod.uat.sit等多环境下使用的不同变量 今天我也在整环境变量,碰到一个小小的bug.装了 cross-env 但还是没 ...

  7. 这可能是最全面的Redis面试八股文了

    Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库.与传统数据库不同的是,Re ...

  8. STL大全

    排序最速传说--sort 我们都学过一些排序的写法,比如冒泡排序,快速排序之类的东西,举个例子来说吧,这是快速排序的代码: #include<iostream> using namespa ...

  9. AGC061 F Perfect String

    毒瘤出题人,史诗加强 AGC 的 F-- 然而我连原题都不会,所以只学了原题做法. 翻译一下题意就是给定一张循环网格图,求经过 \((0,0)\) 的闭合回路条数. 由于网格图中每一个位置都等价,所以 ...

  10. etcd:增加30%的写入性能

    etcd:增加30%的写入性能 本文最终的解决方式很简单,就是将现有卷升级为支持更高IOPS的卷,但解决问题的过程值得推荐. 译自:etcd: getting 30% more write/s 我们的 ...