# VUE开发规范
# 类型规范
对于常量或不修改的变量声明使用
const对于只在当前作用域下有效的变量, 应使用
let, 不再使用var优先使用
const将所有
const变量放在一起, 然后将所有let变量放在一起
const foo = 2222
let foo1 = 222222
let bar = foo
bar = 93333
foo1 = 33333
2
3
4
5
6
# 普通变量命名规范
命名方法: 驼峰命名法
命名规范:
- 命名必须是跟需求的内容相关的词, 比如说我想申明一个变量, 用来表示我的学校, 那么我们可以这样定义
const mySchool = "我的学校"- 命名是复数的时候需要加s, 比如说我想申明一个数组, 表示很多人的名字, 那么我们可以这样定义
const names = new Array()
# 常量
命名方法: 全部大写
命名规范: 使用大写字母和下划线来组合命名, 下划线用以分割单词
const MAX_COUNT = 10
const URL = 'https://www.baidu.com/'
2
# 组件命名规范
# 官方文档推荐及使用遵循规则
PascalCase(单词首字母大写命名)是最通用的声明约定
kebab-case(短横线分隔命名)是最通用的使用约定
组件名应该始终是多个单词的, 根组件 App 除外
有意义的名词, 简短, 具有可读性
命名遵循
PascalCase约定- 公用组件以
Abcd(公司名缩写简称)开头, 如
AbcdDatePicker,AbcdTable- 页面内部组件以组件模块名简写为开头, Item 为结尾, 如
StaffBenchToChargeItem,StaffBenchAppNotArrItem- 公用组件以
使用遵循
kebab-case约定- 在页面中使用组件需要前后闭合, 并以短线分隔, 如
<abcd-date-picker></abcd-date-picker>,<abcd-table></abcd-table>导入及注册组件时, 遵循
PascalCase约定同时还需要注意:必须符合自定义元素规范, 切勿使用保留字
# method 方法命名命名规范
- 驼峰式命名, 统一使用动词或者动词+名词形式
// bad
go, nextPage, show, open, login
// good
jumpPage, openCarInfoDialog
2
3
4
5
- 请求数据方法, 以 data 结尾
// bad
takeData, confirmData, getList, postForm
// good
getListData, postFormData
2
3
4
5
init,refresh单词除外尽量使用常用单词开头(
set,get,go,can,has,is)
附: 函数方法常用的动词:
get获取set设置
add增加remove删除
create创建destory移除
start启动stop停止
open打开close关闭
read读取write写入
load载入save保存
create创建destroy销毁
begin开始end结束,
backup备份restore恢复
import导入export导出
split分割merge合并
inject注入extract提取
attach附着detach脱离
bind绑定separate分离
view查看browse浏览
edit编辑modify修改
select选取mark标记
copy复制paste粘贴
undo撤销redo重做
insert插入delete移除
add加入append添加
clean清理clear清除
index索引sort排序
find查找search搜索
increase增加decrease减少
play播放pause暂停
launch启动run运行
compile编译execute执行
debug调试trace跟踪
observe观察listen监听
build构建publish发布
input输入output输出
encode编码decode解码
encrypt加密decrypt解密
compress压缩decompress解压缩
pack打包unpack解包
parse解析emit生成
connect连接disconnect断开
send发送receive接收
download下载upload上传
refresh刷新synchronize同步
update更新revert复原
lock锁定unlock解锁
check out签出check in签入
submit提交commit交付
push推pull拉
expand展开collapse折叠
begin起始end结束
start开始finish完成
enter进入exit退出
abort放弃quit离开
obsolete废弃depreciate废旧
collect收集aggregate聚集
# views 下的文件命名
只有一个文件的情况下不会出现文件夹, 而是直接放在
views目录下面, 如index.vue尽量是名词, 且使用驼峰命名法
开头的单词就是所属模块名字(
workbenchIndex, workbenchList, workbenchEdit)名字至少两个单词(good:
workbenchIndex)(bad:workbench)
# props 命名
在声明 prop 的时候, 其命名应该始终使用 camelCase, 而在模板中应该始终使用 kebab-case
<!-- bad -->
<script>
props: {
'greeting-text': String
}
</script>
<welcome-message greetingText="hi"></welcome-message>
<!-- good -->
<script>
props: {
greetingText: String
}
</script>
<welcome-message greeting-text="hi"></welcome-message>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 例外情况
作用域不大临时变量可以简写, 比如:
str,num,bol,obj,fun,arr循环变量可以简写, 比如:
i,j,k等
# 结构化规范
# 目录文件夹及子文件规范
- 以下统一管理处均对应相应模块
- 以下全局文件文件均以
index.js导出, 并在main.js中导入 - 以下临时文件, 在使用后, 接口已经有了, 发版后清除
src 源码目录
|-- api 接口, 统一管理
|-- assets 静态资源, 统一管理
|-- components 公用组件, 全局文件
|-- filters 过滤器, 全局工具
|-- icons 图标, 全局资源
|-- datas 模拟数据, 临时存放
|-- lib 外部引用的插件存放及修改文件
|-- mock 模拟接口, 临时存放
|-- router 路由, 统一管理
|-- store vuex, 统一管理
|-- styles 样式文件, 统一管理
|-- uitls 公共函数文件
|-- views 视图目录
| |-- staffWorkbench 视图模块名
| |-- |-- staffWorkbench.vue 模块入口页面
| |-- |-- indexComponents 模块页面级组件文件夹
| |-- |-- components 模块通用组件文件夹
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# vue 文件基本结构
<template>
<div class="demo">
<!--必须在div中编写页面-->
</div>
</template>
<script>
export default {
components: {},
props: {},
data() {
return {
}
},
created() {},
mounted() {},
methods: {},
computed: {},
watch: {}
};
</script>
<!--声明语言, 并且添加scoped-->
<style lang="scss" scoped>
.demo {}
</style>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 多个特性的元素规范
多个特性的元素应该分多行撰写, 每个特性一行。(增强更易读)
<!-- bad -->
<img src="https://vuejs.org/images/logo.png" alt="Vue Logo">
<my-component foo="a" bar="b" baz="c"></my-component>
<!-- good -->
<img
src="https://vuejs.org/images/logo.png"
alt="Vue Logo"
>
<my-component
foo="a"
bar="b"
baz="c"
>
</my-component>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 元素特性的顺序
原生属性放前面, 指令放后面
如下所示:
- class
- id,ref
- name
- data-*
- src, for, type, href, value, max-length, max, min, pattern
- title, alt, placeholder
- aria-*, role
- required, readonly, disabled
- is
- v-for
- key
- v-if
- v-else-if
- v-else
- v-show
- v-cloak
- v-pre
- v-once
- v-model
- v-bind, :
- v-on, @
- v-html
- v-text
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 组件选项顺序
如下所示:
- name
- mixins
- components
- props
- data
- computed
- watch
- created
- mounted
- metods
2
3
4
5
6
7
8
9
10
# 注释规范
代码注释在一个项目的后期维护中显的尤为重要, 所以我们要为每一个被复用的组件编写组件使用说明, 为组件中每一个方法编写方法说明
# 务必添加注释列表
公共组件使用说明
各组件中重要函数或者类说明
复杂的业务逻辑处理说明
特殊情况的代码处理说明,对于代码中特殊用途的变量, 存在临界值, 函数中使用的 hack, 使用了某种算法或思路等需要进行注释描述
多重
if判断语句注释块必须以/** (至少两个星号)开头
单行注释使用 //
# 单行注释
注释单独一行, 不要在代码后的同一行内加注释。例如:
bad
var name ="abc"; // 姓名
good
// 姓名
var name = "abc";
2
3
4
5
6
7
8
# 多行注释
组件使用说明, 和调用说明
/**
* 组件名称
* @module 组件存放位置
* @desc 组件描述
* @author 组件作者
* @date 2017年12月05日17:22:43
* @param {Object} [title] - 参数说明
* @param {String} [columns] - 参数说明
* @example 调用示例
* <hbTable :title="title" :columns="columns" :tableData="tableData"></hbTable>
**/
2
3
4
5
6
7
8
9
10
11
12
# 编码规范
优秀的项目源码, 即使是多人开发, 看代码也如出一人之手。统一的编码规范, 可使代码更易于阅读, 易于理解, 易于维护。尽量按照 ESLint 格式要求编写代码
# 源码风格
# 使用 ES6 风格编码
定义变量使用
let,定义常量使用const静态字符串一律使用单引号或反引号, 动态字符串使用反引号
// bad
const a = 'foobar'
const b = 'foo' + a + 'bar'
// acceptable
const c = `foobar`
// good
const a = 'foobar'
const b = `foo${a}bar`
const c = 'foobar'
2
3
4
5
6
7
8
9
10
11
- 解构赋值
- 数组成员对变量赋值时, 优先使用解构赋值
// 数组解构赋值
const arr = [1, 2, 3, 4]
// bad
const first = arr[0]
const second = arr[1]
// good
const [first, second] = arr
2
3
4
5
6
7
8
- 函数的参数如果是对象的成员, 优先使用解构赋值
// 对象解构赋值
// bad
function getFullName(user) {
const firstName = user.firstName
const lastName = user.lastName
}
// good
function getFullName(obj) {
const { firstName, lastName } = obj
}
// best
function getFullName({ firstName, lastName }) {}
2
3
4
5
6
7
8
9
10
11
12
13
14
- 拷贝数组
使用扩展运算符(...)拷贝数组
const items = [1, 2, 3, 4, 5]
// bad
const itemsCopy = items
// good
const itemsCopy = [...items]
2
3
4
5
6
7
- 箭头函数
需要使用函数表达式的场合, 尽量用箭头函数代替。因为这样更简洁, 而且绑定了 this
// bad
const self = this;
const boundMethod = function(...params) {
return method.apply(self, params);
}
// acceptable
const boundMethod = method.bind(this);
// best
const boundMethod = (...params) => method.apply(this, params);
2
3
4
5
6
7
8
9
10
11
- 模块
- 如果模块只有一个输出值, 就使用
export default, 如果模块有多个输出值, 就不使用export default``, export default与普通的export不要同时使用
// bad
import * as myObject from './importModule'
// good
import myObject from './importModule'
2
3
4
5
- 如果模块默认输出一个函数, 函数名的首字母应该小写
function makeStyleGuide() {
}
export default makeStyleGuide;
2
3
4
- 如果模块默认输出一个对象, 对象名的首字母应该大写
const StyleGuide = {
es6: {
}
};
export default StyleGuide;
2
3
4
5
6
# 指令规范
- 指令有缩写一律采用缩写形式
// bad
v-bind:class="{'show-left':true}"
v-on:click="getListData"
// good
:class="{'show-left':true}"
@click="getListData"
2
3
4
5
6
7
v-for循环必须加上key属性, 在整个for循环中key需要唯一
<!-- good -->
<ul>
<li v-for="todo in todos" :key="todo.id">
{{ todo.text }}
</li>
</ul>
<!-- bad -->
<ul>
<li v-for="todo in todos">
{{ todo.text }}
</li>
</ul>
2
3
4
5
6
7
8
9
10
11
12
13
避免
v-if和v-for同时用在一个元素上(性能问题)以下为两种解决方案:
- 将数据替换为一个计算属性, 让其返回过滤后的列表
<!-- bad -->
<ul>
<li v-for="user in users" v-if="user.isActive" :key="user.id">
{{ user.name }}
</li>
</ul>
<!-- good -->
<ul>
<li v-for="user in activeUsers" :key="user.id">
{{ user.name }}
</li>
</ul>
<script>
computed: {
activeUsers: function () {
return this.users.filter(function (user) {
return user.isActive
})
}
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 将
v-if移动至容器元素上 (比如ul,ol)
<!-- bad -->
<ul>
<li v-for="user in users" v-if="shouldShowUsers" :key="user.id">
{{ user.name }}
</li>
</ul>
<!-- good -->
<ul v-if="shouldShowUsers">
<li v-for="user in users" :key="user.id">
{{ user.name }}
</li>
</ul>
2
3
4
5
6
7
8
9
10
11
12
13
# Props 规范
// bad 这样做只有开发原型系统时可以接受
props: ['status']
// good
props: {
status: {
type: String,
required: true,
validator: function (value) {
return [
'syncing',
'synced',
'version-conflict',
'error'
].indexOf(value) !== -1
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 其他
避免
this.$parent调试信息
console.log()debugger使用完及时删除除了三目运算,
if,else等禁止简写
// bad
if (true)
alert(name);
console.log(name);
// bad
if (true)
alert(name);
console.log(name)
// good
if (true) {
alert(name);
}
console.log(name);
2
3
4
5
6
7
8
9
10
11
12
13
14
15