VUE前端代码开发规范
规范的目的是为了统一编码风格规范,提高代码质量和可读性,增强团队协作开发效率(参考腾讯、百度、字节跳动,同时参考前端代码规范 --代码规范篇 - 掘金 (juejin.cn)[1]等前端规范)
标签语义化,切忌清一色的 div 元素。列表可以使用 ul li,文字使用 p 标签,标题使用 h* 标签,等等。 HTML5 推出了语义化的标签,建议使用:section,aside,header,footer,article,等 HTML5 布局标签。
使用自闭标签的写法,如下
<my-owner-components />
<template>
<scroll
ref="scrollWrap"
class="home-scroll-warp"
:data="homeData"
:pullDownRefresh="true"
:pullUpLoad="true"
@pullingDown="pullingDownGetNewData"
@pullingUp="pullingUpGetMore"
/>
</template>
在模版中使用表达式,复杂情况使用计算属性或函数,如下:
<template>
<div v-show="getLimitData(data)">
...
</div>
</template>
// 反例
<template>
<div v-show="data.type !== 'dir' && dzqz && hasBtn && attrs.mode !== 'ended'">
...
</div>
</template>
根据元素嵌套规范,每个块状元素独立一行,内联元素可选,如下:
// 第一种
<div>
<h1></h1>
<p></p>
</div>
<p><span></span><span></span></p>
// 第二种
<div>
<h1></h1><p></p>
</div>
<p>
<span></span>
<span></span>
</p>
避免过多重复代码,如果超过三行类似的代码,配置数据再循环遍历
<!-- 单行注释 -->
<div class="test">
<!-- 组件注释 -->
<gdCustomTable ref="gdCustomTable" />
<!-- 其他注释 -->
<div>...</div>
</div>
<!--
多行注释
多行注释
-->
<div>内容</div>
推荐使用 UnoCSS 引擎进行原子化 CSS 开发 推荐使用 scss 预编译 由于样式的情况比较多也比较复杂 做出如下规范
避免使用标签选择器。因为在 Vue 中,特别是在局部组件,使用标签选择器效率特别低,损耗性能,建议需要的情况,直接定义 class;
非特殊情况下,禁止使用 ID 选择器定义样式。有 JS 逻辑的情况除外;
避免使用 important 选择器;
避免大量的嵌套规则,控制在 3 级之内,对于超过 4 级的嵌套,考虑重写或新建子项;
避免使用 ID 选择器及全局标签选择器防止污染全局样式;
|assets
|-- styles
| |-- common 放置公用样式,如重置,混合,复写element样式等
| |-- modules 放置模块样式
/* 推荐 */
.jdc {}
.jdc li {}
.jdc li p{}
/* 不推荐 */
*{}
#jdc {}
.jdc div{}
<style lang="scss" scoped>
.app-wrapper {
...
}
</style>
/* css */
.class-name {
color: red;
border-color: red;
}
/* scss */
$color: red;
.class-name {
color: $color;
border-color: $color;
}
CSS 属性书写顺序:先决定定位宽高显示大小,再做局部细节修饰,推荐顺序(可以提升浏览器渲染 dom 的性能):
定位属性(或显示属性,display)->宽高属性->边距属性(margin, padding)->字体,背景,颜色等,修饰属性的定义,这样定义为了更好的可读性,让别人只要看一眼就能在脑海中浮现最终显示的效果。
布局定位属性:display / position / float / clear / visibility / overflow
自身属性:width / height / margin / padding / border / background
文本属性:color / font / text-decoration / text-align / vertical-align / white- space / break-word
其他属性(CSS3):content / cursor / border-radius / box-shadow / text-shadow / background:linear-gradient … 以下给出常用的定义示例:
.class-name {
position: fixed;
top: 100px;
left: 0;
right: 0;
bottom: 0;
display: block;
width: 100%;
height: 100%;
margin: 10px;
padding: 10px;
font-size: 14px;
color: #000;
background-color: red;
border-radius: 2px;
line-height: 1.42;
}
组件内部需要覆盖 UI 框架样式,必须在最外层组件加类名
以/ 注释内容 /格式注释,前后空格,嵌套子类需要一个回车分割开
/* 注释内容 */
.pha-element {
width: 20px;
/* 这里需要换行 */
.pha-element-l {
color: blue
}
}
// 推荐
console.log('路由': 文件路由, '打印简述': 打印数据)
// 不推荐
console.log(打印数据, '1111')
// 不推荐
if (!isUserNotBlocked(user)) {
// ...
}
/**
* 接口请求
* @param req 接口api
* @param params 参数
*/
const loading = ref(false)
async httpInterface(req, params) {
try {
loading.value = true
const res = await req(params)
returnPromise.resolve(res)
} catch (e) {
returnPromise.reject(e)
} finally {
loading.value = false
}
}
// 一些说明...
const userID = 24;
const userID = 12; // 一些说明
/*
* 针对下方代码的说明
* 第一行太长写第二行
*/
const a = 1;
/**
* @Description 加入购物车
* @Author lint
* @Date 2020-09-08
* @param {Number} goodId 商品id
* @param {Array<Number>} specs sku规格
* @param {Number} amount 数量
* @param {String} remarks 备注
* @returns <Promise> 购物车信息
*/
apiProductAddCard = (goodId, specs, amount, remarks) => {
return axios.post('***', { goodId, specs, amount, remarks })
}
|components
|-- gdCustomCheck
| |-- index.vue
|-- gdCustomTable
| |-- index.vue
按照小驼峰命令,英文单词过长或超出 2 个以上,可缩略至前四位,如
// 业务统计
approvalStatistical
// 缩略
approvalStat
图片使用 img,图标使用 icon
can 判断是否可执行某个动作,函数返回一个布尔值。true:可执行;false:不可执行has 判断是否含有某个值, 函数返回一个布尔值。- true:含有此值;false:不含有此值is: 判断是否为某个值,函数返回一个布尔值。true:为某个值;false:不为某个值get: 获取某个之,函数返回一个非布尔值set: 设置某个值,无返回值、返回是否设置成功或者返回链式对象 load 加载某些数据,无返回值或者返回是否加载完成的结果// 公共方法的定义,可以提供外面使用
publicbFunction () {}
// 私有方法,下划线定义,仅供组件内使用。多单词,注意与系统名字冲突!
_privateFunction () {}
import Article from'xxx'
import ArticleDetail from'xxx'
let、const、避免使用varlet userName = ref('luffy')
const userInfo = reactive({
name: 'luffy'
})
_划分const Api = {
ITEMS_OFONE_TYPE = '***', // 获取事项分类
SOLUTION_LIST = '***',, // 获取事项列表
}
简写 说明 get\set 取值\给值 add\remove 增加\移除 show\hide 显示\隐藏 view 查看 browse 浏览 edit 修改 save 保存 delete 删除 find 查询 undo 撤销 redo 重做 clean 清除 index 索引 observe 观察 send\receive 发送\接收 refresh\synchronize 刷新\同步
数据类型/标签 简写后缀 object obj array arr json json function fn message msg button btn
class 命名以小写字母开头,小写字母、中划线和数字组成。不建议使用驼峰法命名 class 的属性。以下是一些常用到的 class 的名字:
master 分支作为主干分支,及生产环境,多人协同开发时一定要按照分支规范去建立和提交分支,具体如下:
