前言之前:缩进必须规范!缩进必须规范!缩进必须规范!统一使用 Tab 进行缩进,且将制表符长度设置为 4
前言:
本文档包含 ES6 语法内容,虽然 ES6 语法已经比较成熟,而且基本前台项目的框架都是基于 Vue 框架,
良好支持 ES6 语法,但鉴于公司现有的 APP 项目等,需要向下兼容 ES5 语法,
所以本文档关于用于 ES6 语法的内容在 ES5 项目中仅作参考。
(提供一种解决办法,用 ES6 编写之后将 ES6 代码编译成 ES5 gulp方式 webpack方式 在线转换)
——本文档参考 google、网易、阿里、腾讯等前端编码规范
<html>
<head>
<title>Page titletitle>
head>
<body>
<img src="/static/bg.png" alt="暂无图片">
<h1 class="hello-world">Hello, world!h1>
body>
html>
无需空格
需要空格
/*not good*/
.element {
color :red! important;
background-color: rgba(0,0,0,.5);
}
/* good */
.element {
color: red !important;
background-color: rgba(0, 0, 0, 0.5);
}
/* not good */
.element ,
.dialog{
...
}
/* good */
.element,
.dialog {
}
/* not good */
.element>.dialog{
...
}
/* good */
.element > .dialog{
...
}
} 后跟一个空行
/* not good */
.element {
...
}
.dialog {
...
}
/* good */
.element {
...
}
.dialog {
...
}
无需换行
需要换行
/* not good */
.element
{color: red; background-color: black;}
/* good */
.element {
color: red;
background-color: black;
}
/* not good */
.element, .dialog {
...
}
/* good */
.element,
.dialog {
...
}
1.1 基本规范
1.2 常量定义
const PI = 3.1415926; // const - 不可重定义 且 无法重新赋值
const BASE_URL = 'http://10.0.2.212:19110'
1.3 类的定义
注: 关于 ES6 class类 的学习可以参考 —— MDN上的《 类 》这篇教程
class Rectangle {
//...代码块
}
1.4 字符串定义相关
1.5 特例
2.1 switch 语句
switch 适用于条件的值等情况下
如果条件较小的话选用 if else 比较合适
条件数量较大建议选用 switch
大多数的情况下 switch 比 if else 运行的更加快
案例:滁州项目中通过 sos 字段返回值判断手环的状态
// if语句代码如下:
if (rowData.sos == 1) {
return '进入围栏';
} else if (rowData.sos == 2) {
return '出围栏';
} else if (rowData.sos == 3) {
return '低电量';
} else if (rowData.sos == 5) {
return 'sos告警';
} else if (rowData.sos == 14) {
return '离线报警';
} else if (rowData.sos == 15) {
return '开机报警';
} else if (rowData.sos == 16) {
return '关机报警';
} else if (rowData.sos == 65) {
return '脱落报警';
} else if (rowData.sos == 66) {
return '蓝牙丢失报警';
} else if (rowData.sos == 104) {
return '佩戴报警';
} else if (rowData.sos == 200) {
return '温度心率超过阀值报警';
} else {
return '-';
}
// 即便使用if语句,也建议把常用项放到第一位,减少判断次数,譬如rowData.sos == 5
// switch语句代码如下:
switch (rowData.sos) {
case '1':
return '进入围栏';
break;
case '2':
return '出围栏';
break;
case '3':
return '低电量';
break;
case '5':
return 'sos告警';
break;
case '14':
return '离线报警';
break;
case '15':
return '开机报警';
break;
case '16':
return '关机报警';
break;
case '65':
return '脱落报警';
break;
case '66':
return '蓝牙丢失报警';
break;
case '104':
return '佩戴报警';
break;
case '200':
return '温度心率超过阀值报警';
break;
default :
return '-';
}
// 可读性相对if语句更高
2.2 推荐解决方案
// 例1:
// 后台返回字段 fruit 该字段返一个数字
// 0 = 苹果, 1 = 梨子, 2 = 桔子, 3 = 柠檬, 4 = 芒果...
let aFruit = ['苹果', '梨子', '桔子', '柠檬', '芒果'];
let sFruit = aFruit[fruit];
console.log(sFruit);
// 例2:
// 用对象方法解决上述的 if / switch 案例,后台传入rowData.sos前端体现状态
let oWatchStatus = {
"1": "进入围栏",
"2": "出围栏",
"3": "低电量",
"5": "sos告警",
"14": "离线报警",
"15": "开机报警",
"16": "关机报警",
"65": "脱落报警",
"66": "蓝牙丢失报警",
"104": "佩戴报警",
"200": "温度心率超过阀值报警"
}
return oWatchStatus[rowData.sos];
1、尽量使用 object[key] 的方式取 value 值,防止后台返回的 Key 值存在不符合规范格式的问题
2、如果后台返回数据需要前台做复杂操作,可要求后台返回需要格式的数据
3.1 注释原则
3.2 单行注释
例1:
// not good:
map.centerAndZoom(point, 16); //初始化地图,设置中心点坐标和地图级别
// good:
map.centerAndZoom(point, 16); // 初始化地图,设置中心点坐标和地图级别
// perfect:
// 初始化地图,设置中心点坐标和地图级别
map.centerAndZoom(point, 16);
例2:
// not good: --> 多行注释
/*label.setStyle({
position: "relative",
border: "1px solid rgb(204, 204, 204)",
color: "rgb(0, 0, 0)",
textAlign: 'center',
borderRadius: "10px",
padding: "5px",
background: "rgb(255, 255, 255)",
});*/
// good: --> 分行注释
// label.setStyle({
// position: "relative",
// border: "1px solid rgb(204, 204, 204)",
// color: "rgb(0, 0, 0)",
// textAlign: 'center',
// borderRadius: "10px",
// padding: "5px",
// background: "rgb(255, 255, 255)",
// });
3.3 函数 / 方法注释
{…} 中的数据类型应该填写明确的数据类型或者具体的实体类 (该点在 TypeScript 语法中也有所体现)
例如: @param {String} 、@return {Object} 、@param {Student} ==> (Student 为自定义类)
当暂时不确定数据类型的时候可以用 {any} 占位,明确后修改为相应的数据类型
/**
* @description : 通过设置面板设置该元素css属性
* @method setCss
* @param {string} key : css的key值
* @param {any} value : css的value值 / 若flag为true -- 为携带value值的dom元素
* @param {boolean} flag : 用于区分传入的是否是需要正则转换的对象
*/
function setCss(key, value, flag) {
if (!flag) {
switch (key) {
case "cycleNum":
if (value) {
$("#imageCyclesCount").attr("disabled", "disabled");
value = "infinite";
} else {
$("#imageCyclesCount").removeAttr("disabled");
var aniNum = $("#imageCyclesCount").val();
aniNum == "" ? value = 0 : value = aniNum;
}
break;
}
Widget.widgetData.currentObject.setProperty(key, value);
} else {
// 当echarts组件调用该方法时传入true
Widget.widgetData.currentObject.setProperty(key, value, true);
}
}
拓展:for…of 的对象遍历
varobj = {
name: "hello",
age: "18"
};
for(var i of Object.keys(obj)){
console.log(i);
// name
// age
}
for(var i of Object.values(obj)){
console.log(i);
// hello
// 18
}
for(var i of Object.entries(obj)){
console.log(i);
// ["name", "hello"]
// ["age", "18"]
}
4.1 分号
注:想要 return 的值,不可换行书写
return
" ";
// 该段程序运行报错,就是JS自动添加分号的功能造成的,直接解析为 return;中断代码执行
解决办法:
return " ";
4.2 空格
let sUserName = 'Jack';
for (let i = 0; i < aMyArray.length; i ++) {...}
let oUser = {
name: 'Tom',
age: 15,
hobbies: [
reading: true,
writing: false,
]
}
1 == 0 ? console.log(123) : console.log(456);
4.3 统一用词规范
在函数嵌套时,为了改变 this 的指向,统一使用 that 承接
(现有代码中很多使用 _this 或 _self 不统一,且书写相对困难)
尽可能的使用 箭头函数 ,防止 this 指向发生改变而导致需要重新定义变量
const that = this;
4.4 Axios 之后的链式写法
// not good -- 此段代码极其不规范
const validateExsit=(rule, value, callback) => {
this.$axios({
method:'get',
params:{name:value},
url:'/maintKind/isNameExists'
})
.then(
res=>{
let status=res
if(status!=true) {
callback(new Error('该物种已存在'));
}
else{
callback()
}
}
)
};
// good
const validateExsit = (rule, value, callback) => {
this.$axios({
method: 'get',
params: {
name: value
},
url: '/maintKind/isNameExists'
}).then((res) => {
let status = res;
if (status!=true) {
callback(new Error('该物种已存在'));
} else {
callback();
}
}).catch((rej) => {
console.log(rej);
});
}
4.5 setTimeout / setInterval
setTimeout(function () {
console.log('Hello World')
}, 1000)
1.1 文件夹命名
1.2 文件命名
1.3 类名命名规范
中的最外层 使用和文件名一致的类名
- 所有 Vue 项目的
标签中选择器前加 .文件名 的类名进行约束
- 统一不用
这种 Vue 自带的样式局限约束(因为无法穿透组件)
- 两个样式块中间用换行符隔开
例: 文件名为 HelloWorld.vue
<template>
<div class='HelloWorld'>
<div class='content'>
<p class='title'>
......
p>
div>
<div class='footer'>
......
div>
div>
template>
<script>
......
script>
<style>
.HelloWorld .content {
width: 100%;
height: 100%;
}
.HelloWorld .title {
font-size: 12px;
background-color: lightpink;
}
.HelloWorld .footer {
font-size: 12px;
background-color: lightpink;
}
style>
为书写更方便,可使用 less 嵌套语法进行样式书写,使层次结构更加分明(可少写很多次 .文件名)
- 嵌套时请先书写 父元素 中的属性,再书写 子元素 代码块
- 若 父元素 有属性,请用空行和 子元素 代码块隔开
/* not good */
/* good */