二.Vue项目规范

(一) Vue 编码规范

vue项目规范以Vue官方规范中的A规范为基础。

2.1.1 组件规范

1)组件名为多个单词

组件名应该始终是多个单词组成(大于等于2),且命名规范为PascalCase。

正确示例:name : 'TodoItem'

错误示例:name : 'Todo'   、 name: 'todo-item'

个人感悟:很正常的要求啊,避免和html元素冲突的一种设置。

2)组件文件名要么始终是单词大写开头 (PascalCase),要么始终是横线连接(kebab-case)。

正确示例:my-component.vue   MyComponent.vue

错误示例:mycomponent.vue   myComponent.vue

个人感悟:本人就经常命名成myComponent,得改得改。 

3)基础组件文件名为base开头,使用完整单词而不是缩写

正确示例:base-button.vue   base-table.vue

错误示例:MyButton.vue  VueTable.vue

个人感悟:这个错误也是很经典,很多时候真的会定义成MyButton。

4)和父组件紧密耦合的子组件应该以父组件名为前缀命名

正确示例:todo-list.vue        user-profile-options.vue

错误示例:UProfOpts.vue

个人感悟:别怕名字长,就怕别人看不懂。

5)在Template模板中使用组件,应使用PascalCase模式,并且使用自闭合组件。

正确示例: <MyComponent />

错误示例:<my-component />

个人感悟: 记得Vue是能识别对于的大小写的,所以按规范来就好。

6)组件的data必须是一个函数

当在组件中使用data属性的时候,它的值必须是返回一个对象的函数。因为如果直接是一个对象的话,子组件之间的属性值会互相影响。

个人感悟:这个在开发中真没遇到过,基本上每个人都会将data设置为函数。

7)Prop定义应该尽量详细

必须使用camelCase驼峰命名

必须指定类型

必须加上注释,表面其含义

必须加上required 或者 default ,二者二选其一

如果有业务需求,必须加上 validator 验证

正确示例:

props: {

// 组件状态,用于控制组件的颜色

        status: {

                type: String,

                required: true,

                validator: function (value) {

                        return [

                                'succ',

                                'info',

                                'error'

                                ].indexOf(value) !== -1

                }

        },

// 用户级别,用于显示皇冠个数

        userLevel:{

                type: String,

                required: true

        }

}

个人感悟:很详细很细致的规范,严格执行就好。

8)为组件样式设置作用域

个人感悟:就是组件样式里style加上一个scoped,能有效防止样式互相污染和影响。

9)如果特性元素较多,应该主动换行

个人感悟:别全部写在一行里面,我最初写代码真这样,全写一大行,看的时候很麻烦。

2.1.2 模板中使用简单的表达式

组件模板应该只包含简单的表达式,复杂的表达式应该重构为计算属性或者方法。

正确示例:

<template>

        <p>{{ normalizedFullName }}</p>

</template>

computed:{

        normalizedFullName:....

}

错误示例:

<template>

        <p>        

                {

                        fullName.split(' ').map(...)...

                 }}

        </p>

</template>

个人感悟:很合理的一个规范,没什么人会希望在模板中写一长串内容吧。

2.1.3 指令都使用缩写形式

指令推荐都使用缩写形式,(用:表示v-bind、用@表示v-on、用#表示v-slot)

正确示例:

<input

        @input = "onInput"

        @focus = "onFocus"

>

错误示例:

<input

        v-on:input = "onInput"

        v-on:focus = "onFocus"

>

个人感悟:说实话作为一个小白,用久了:@#,都有点记不清原本代表了啥了。

2.1.4 标签顺序保持一致

单文件组件应该总是让标签顺序保持为 template script style

个人感悟:保持好这个顺序就行,遵守规范。

2.1.5 必须为 v-for 设置键值 key

个人感悟:貌似是一道面试题,设置上key可以防止v-for里面出现错误,就是能帮助你更好的定位要删除的内容,防止你删完顺序不对。

2.1.6 v-show 与 v-if 选择

如果运行时,需要非常频繁地切换,使用v-show;如果在运行时,条件很少改变,用v-if

个人感悟:一般情况都是v-show吧,不可避免的会有人喜欢频繁切换。

2.1.7 script 标签内部结构顺序

name>components>mixins>props>data>computed>watch>filter>钩子函数(钩子函数按其执行顺序)>methods

个人感悟:这个真的太重要了,不知道这个规范前我都是乱放位置,找起来特别麻烦。

2.1.8 Vue Router 规范

1)页面跳转数据传递使用路由参数

页面跳转,例如从A页面跳转到B页面,需要将A页面的数据传递到B页面,推荐使用路由参数传参,而不是将数据存在vuex,然后在B页面中取出vuex数据,因为如果在B页面刷新,会导致vuex数据丢失,导致B页面无法正常显示数据。

正确示例:

let id = '123'

this.$router.push({name : 'userCenter', query})

个人感悟:很好的规范,之前就是喜欢全部写到vuex或者pinia里面,就会出现描述的问题,一刷新就无法正确显示数据,有时候还会写在localstorage里,既然官方说了那就路由传参。

2)使用路由懒加载(延迟加载)机制

正确示例:

{

        path:'/uploadAttachment',

        name:'/uploadAttachment',

        meta:{

                title:'上传附件'

        },

        component:() => import('@/view/components/uploadAttachment.index.vue')

}

个人感悟:个人确认不常用这么写,但是能按需加载的话还是对优化有效的,可以学起来。

3)router中的命名规范

path、children命名规范采用kebab-case命名规范(尽量vue文件的目录结构保持一致,因为目录、文件名都是kebab-case)

name命名规范采用kebab-case命名规范且和component组件名一致!(因为要保持keep-alive特性,keep-alive按照component的name进行缓存,所以二者必须高度保持一致)

个人感悟:说实话,一个个不同的命名规范,确实累人,但是遵守规范总是没错的。

4)router中的path命名规范

path处理采用kebab-case命名规范意外,必须以 / 开头,及时是children里的path也要以 / 开头。

目的:某个页面有问题要立刻找到这个vue文件,如果不用以/开头,path为parent和children组成的,可能经常需要在router文件里多次才能找到,而如果以/开头,则能立刻搜索到组件。

(二) Vue 项目目录

2.2.1 基础

vue项目中的所有命名一定要与后端命名统一。

比如权限:后端privilege,前端无论router,store,api等都必须使用privilege单词!

个人感悟:这个属性命名最好就是前后端都根据详细设计来命名,但是就是会有人不按规范,尤其是后端如果不按规范,前端也不得不去配合,很难受。

2.2.2 使用 Vue-cli 脚手架

使用vue-cli3 来初始化项目,项目名按照上面的命名规范。

2.2.3 目录说明

目录名按照上面的命名规范,其中components组件用大写驼峰,其余除components组件目录外的所有目录均使用kebab-case命名。

1)api目录

文件、变量命名要与后端保持一致。

此目录对应后端API接口,按照后端一个controller一个api.js文件。若项目较大时们可以按照业务划分子目录,并与后端保持一致。

api中的方法名字要与后端api url 尽量保持语义高度一致性。

对应api中的每个方法要添加注释,注释与后端swagger文档保持一致。

正确示例:

后端url:EmployeeController.java

/employee/add

/employee/delete/{id}

/employee/update

前端:employee.js

// 添加员工

function addEmployee(data) {

        return postAxios('/employee/add',data)

}

// 更新员工信息

function updateEmployee(data) {

        return postAxios('/employee/update',data)

}...

个人感悟:对应后端api也是个麻烦活,需要双方及时沟通。最好能有对应的文档。

2)assets目录

assets 为静态资源,里面存放images,styles,icons等静态资源,命名格式为kebab-case

3)components目录

此目录应按照组件进行目录划分,目录命名为kebab-case,组件命名规则也为kebab-case

4)constants目录

此目录存放项目所有常量,如果常量在vue中使用,请使用vue-enum插件。

4)router与store目录

这两个目录一定要将业务进行拆分,不能放在一个js文件里。

router尽量按照views中的结构保持一致

store按照业务进行拆分不同的js文件

6)views目录

命名要与后端、router、api保持一致。components中的组件要使用PascalCase规则。

2.2.4 注释说明

必须加注释的几个地方

公共组件使用说明

api目录的接口js文件必须加注释

store中的state,mutation,action必须加注释

vue文件中的template必须加注释,若文件较大添加start end注释

vue文件的methods ,每个method必须添加注释

vue文件的data,非常见单词要加注释

个人感悟:ai写的代码就是处处有注释,至少保证了一定的可读性。

 

2.2.5 其他

1)尽量不要手动操作DOM

因使用vue框架,所有在项目开发中尽量使用vue的数据驱动更新DOM,尽量不要手动操作DOM,包括:增删改dom元素、以及更改样式、添加事件等。

2)删除无用代码

因使用了git/svn等代码版本根据,对于无用的代码必须及时删除,例如:一些调试的console语句、无用的弃用功能代码。

个人感悟:不删console就上线,我一直以为是开玩笑。直到自己亲身经历。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐