Vuejs开发规范小结 - by DireW

358 阅读7分钟

  • 前置条件:


1、程序员是懒惰的。

2、属于【强制】的,必须遵守,属于【建议】的,根据个人情况编写代码。但是需要有个认知,语法糖的使用,是让程序员偷懒。

3、争取格式都统一,方便团队内部维护同一份代码。至于新旧语法的使用,不强求一定使用新语法,要求遇到不懂的新语法上网查阅或者询问原作者。

  • 零、vue文件结构相关(可一起探讨决定)


1、【建议】建议在一个vue文件中完成HTML,JavaScript,style代码的编写,这样的话IDEA会帮忙匹配对应的方法入口,以及标注对应的变量。

2、【强制】业务代码处理数据不允许禁用eslint检查。暂时能想到的只有个别工具类中用到不检查。

  • 一、变量相关:


1、【强制】命名必须准确,尽量在4个单词以内描述清楚该变量含义。减少“name”,“id”的独立字段存在,局部变量当中应当指明是departmentName或者companyId。

反例:


避免指代不清楚的变量,此处是公共组件获得部门信息

正例:



2、【强制】vue实例的data中,属于该vue页面的全局变量,由this.xxx调用,需要加上注释,除非是很通用的属性,如searchCondition或pagination。

同时应当根据具体属性分组,避免一个data中包含太多一级属性值。

反例:


正例:


3、【建议】vue实例的data中,定义完一级属性之后,如果属于对象类型的,建议在该属性后面将涉及到的子属性完整列出,方便查看数据结构。

反例:


讨论:数组是否有必要设置?


4、【建议】除非是专有名词的缩写,否则使用英文的时候,开启idea英文单词检查,不要出现错误的单词。

反例:



5、【强制】以下情况的变量命名结构统一(未完待续 )

①ref拥有唯一性,单个vue文件内不允许重复。定义的时候在命名之后加“Ref”标志

ref=“clearingFormRef” ref="editClearingModalRef”

类似mybatis中的refid,同个命名空间内,给sql语句赋值唯一标识,提供别处调用。

②布尔值的变量,遵循动词+名词的格式,构成一个持续性的动作。也可在之前增加is、if

loadingClearingList isLoadingClearing isEditModalVisible

③属于表单的变量使用Form结尾,对应的校验规则使用FormRules结尾

clearingForm clearingItemFormRules

④(建议)使用console的时候,写清楚当前打印的是什么信息

console.info('fetch salary list response', res);


二、方法相关:


1、【强制】方法名由动词+名词组成,用来描述是如何处理(动词)某个数据(名词)。

对比代码:



2、【强制】一个方法做一件事,如果有重复的逻辑可以单独抽出另一个方法统一调用。原则上不允许一个方法处理不同类型的业务。

反例:




上方代码中,点击不同的input框进入同个方法,然而方法内部的逻辑与两个调用之间,并没有完全匹配type值。


3、【强制】方法参数不能超过5个,且参数名称需要准确,属于局部变量的命名方法

反例:



4、切忌过度封装,一两句话可以解决的代码,没必要跳转到别的地方再重新判断后运行

反例:



实际效果:this.$message({ options });

  • 三、代码注释


1、【强制】属于vue实例的data变量,建议增加注释

2、【强制】方法之上增加注释,除非方法名已经很明确,且方法体内容很直观的。

说明:使用单行注释或者多行注释均可,大部分情况下单行注释即可

3、【强制】方法内业务操作,涉及分支判断的,增加注释


  • 四、vuejs写法

1、【强制】代码不允许超过idea规定的每行字数,由一条竖线标识,默认配置为120个字符,如果是HTML标签内容很多,缩进很多的,允许适当超出范围。

2、【强制】template代码中,开始标签和结束标签如果不在同一行的,将标签对齐。

3、【强制】组件标签带多个属性导致折行显示的,将每个属性显示在一行内,有设置ESLint格式化的可以直接格式化。

4、关于v-for循环中key的设置,现在增加了eslint检查,所以问题不大

5、关于element-ui的使用,主要是文档的查看,已知的有el-select的误用,以及disable属性重复使用的问题。

反例:


此处涉及HTML基础知识。

6、关于computed计算属性和watch监听属性的使用,理解一个“A属性影响B属性”即可。computed对应B属性,需要return的结果,所以不能有异步回调。watch对应A属性,可以有异步的操作。

例如:data中有人民币金额cnyAmount【页面动态修改】及美元金额usdAmount【只做展示】。

computed对应的是计算结果usdAmount,watch的是发生变化的cnyAmount,伪代码如下图


7、财务部系统,已经确认的是切换每页条数的时候,将页码设置为1

a、之前几乎所有切换每页条数的都没设置,fiweb已经全面排查过一次。

b、不用单独监听“上一页”“下一页”的事件

反例:



正例:




8、关于常见的input框只能输入某些类型的数据,通过正则设置,以下为两种使用场景(如果配合校验规则的话,有model值同步的bug,可以随时探讨交互方式)

①input框只能输入中文,非中文的都不会显示到上面

<el-input v-model="text" oninput="value = value.replace(/[^\u4e00-\u9fa5]/g,'')" />

②input框什么都可以输入,但是输入后过滤出中文字符

<el-input v-model="num" @change="num = num.replace(/[^\u4e00-\u9fa5]/g,'')" />

9、关于日期组件,中间变量的使用方式:

场景:日期组件用来配置日期区间的时候,组件记录值为null(无值)或者数组(有值),而后端使用开始时间和结束时间两个字段接收。

反例:需要用到日期时再取值,可能引起不必要的判断,以及多个地方使用的时候都要重新赋值。



建议:直接在中间变量变化的时候,将最终条件字段同步更新上来。




五、细节建议(可探讨)

1、后端相关,接口定义的时候,应该明确接口的入参出参。尽量避免一个方法操作太多逻辑。

1.1、关于从列表到详情页或者编辑页,现在普遍的用法是从列表单行数据跳转到详情页,其实不可取

a、列表就是缩略信息,详情页才是完整信息

b、应该只有id到详情页,然后详情页发起请求

c、详情页的完整数据,假设最上方是主表字段,下方跟着其他关联表的信息,建议一个接口搞定所有的数据,用大VO的概念封装返回值。

2、前端相关,必要的时候才发起请求,由于接口已经确定,接口数据结构应该是确定的,如果是都不变化的数据,不用重复向后台请求。

3、程序员如何偷懒,使用各种语法糖减少代码:

a、变量不想多写,所以有对象解构。es6.ruanyifeng.com/#docs/destr…

// ES5
 const name = company.name;
 const id = company.id; const companyCode = company.code;

// ES6
const { id, name, code: companyCode } = company;

    b、不想写function单词,所以以下两个eat,drink方法都是一样的效果。

const man = {    name: "zhangsan",    eat: function(){ console.info(1) },    drink() { console.info(2) }}

js代码块 展开源码

c、想自由传递this对象,可以用箭头函数 es6.ruanyifeng.com/#docs/funct…

// ES5
const that = this;setTimeout(function(){    console.info(that);}, 0);// ES6 箭头函数
setTimeout(() => {    console.info(this);}, 0);

    d、不想写for循环处理数据,可以用forEach(无返回值),map(有返回值),filter(过滤数据)

4、关于多层的if影响代码阅读

a、将处理逻辑抽成独立的方法。
b、将else的情况提前判断之后return。

反例:



正例:


5、关于第三方库的使用,个人已知的是momentjs处理时间和日期,lodash处理对象或数组数据。

6、关于async、await用法,以及回调函数实现js中的异步逻辑。(根本原因:js是单线程的)

①最早是ajax请求,成功的回调,失败的回调,在回调里面发起第二个请求。

②generator工具,生成递归的状态机判断几个请求按顺序完成。

③Promise状态机(axios,fetch)。

7、建议在每个vue页面的created钩子中增加一行打印本vue文件的名字,方便排查线上问题。