前端開發(fā)必備小技巧之前端代碼規(guī)范Vue篇
前端代碼規(guī)范
規(guī)范的目的是為了編寫高質(zhì)量的代碼,讓你的團(tuán)隊(duì)成員每天得心情都是愉悅的,大家在一起是快樂的。
引自《阿里規(guī)約》的開頭片段:
…現(xiàn)代軟件架構(gòu)的復(fù)雜性需要協(xié)同開發(fā)完成,如何高效地協(xié)同呢?無規(guī)矩不成方圓,無規(guī)范難以協(xié)同,比如,制訂交通法規(guī)表面上是要限制行車權(quán),實(shí)際上是保障公眾的人身安全,試想如果沒有限速,沒有紅綠燈,誰還敢上路行駛。對(duì)軟件來說,適當(dāng)?shù)囊?guī)范和標(biāo)準(zhǔn)絕不是消滅代碼內(nèi)容的創(chuàng)造性、優(yōu)雅性,而是限制過度個(gè)性化,以一種普遍認(rèn)可的統(tǒng)一方式一起做事,提升協(xié)作效率,降低溝通成本。代碼的字里行間流淌的是軟件系統(tǒng)的血液,質(zhì)量的提升是盡可能少踩坑,杜絕踩重復(fù)的坑,切實(shí)提升系統(tǒng)穩(wěn)定性,碼出質(zhì)量。
一、前端代碼規(guī)范Vue篇

1、Vue編碼基礎(chǔ)
Vue 項(xiàng)目規(guī)范以 Vue 官方規(guī)范https://v2.cn.vuejs.org/v2/style-guide/中的A規(guī)范為基礎(chǔ),在其上面進(jìn)行項(xiàng)目開發(fā),故所有代碼均遵守該規(guī)范。
請仔仔細(xì)細(xì)閱讀 Vue官方規(guī)范,切記,此為第一步。
1.1、組件規(guī)范
- 組件名為多個(gè)單詞
組件名應(yīng)該始終是多個(gè)單詞組成(大于等于 2),且命名規(guī)范為KebabCase格式。
這樣做可以避免跟現(xiàn)有的以及未來的 HTML 元素相沖突,因?yàn)樗械?HTML 元素名稱都是單個(gè)單詞的。
正例:
export default {
name: 'TodoItem',
// ...
}
反例:
export default {
name: 'Todo',
// ...
}
export default {
name: 'todo-item',
// ...
}
- 組件文件名為 pascal-case 格式
正例:
components/ |- my-component.vue
反例:
components/ |- myCoaponent.vue |- MyCoaponent.vue
- 基礎(chǔ)組件文件名為 base 開頭,使用完整單詞而不是縮寫
正例:
components/ |-base-button.vue |-base-table.vue |-base-icon.vue
反例:
components/ |- MySutton.vue |- VueTable.vue |- Icon.vue
- 和父組件緊密屬合的子組件應(yīng)該以父組件名作為前綴命名
正例:
components/ |- todo-list.vue |- todo-list-item.vue |- todo-list-item-button.vue |- user-profi1e-options.vue(完整單詞)
反例:
components/ |- TodoList.vue |- TodoItem. vue |- TodoButton.vue |- UProfopts.vue(使用了縮寫)
- 在Template 模版中使用組件,應(yīng)使用 PascalCase 模式,并且使用自閉合組件。
正例:
<1--在單文件組件、字符串模板和JSX中--> <myComponent /> <Rom><table :colum="data"/></Rom>
反例:
<my-component /><row><table :column="data"/></row>
- 組件的 data 必須是一個(gè)函致
當(dāng)在組件中使用 data 屬性的時(shí)候 (除了 new Vue 外的任何地方),它的值必須是返回一個(gè)對(duì)象的函數(shù)。 因?yàn)槿绻卑词且粋€(gè)對(duì)象的話,子組件之間的屬性值會(huì)互相影響,
正例:
export default {
name: 'App',
data(){
return{
title:'我是一個(gè)標(biāo)題',
}
},
}
反例:
export default {
name: 'App',
data:{
title:'我是一個(gè)標(biāo)題',
},
}
- Prop 定義應(yīng)該盡量詳細(xì)
- 必須使用 camelCase 駝峰命名
- 必須指定類型
- 必須加上注釋,表明其含義
- 必須加上 required 或者 default,兩者二選其一
- 如果有業(yè)務(wù)需要,必須加上 validator 驗(yàn)證
正例:
export default {
name: "HelloWorld",
props: {
//組件狀態(tài),用于控制組件的顏色
status: {
type: String,
required: true,
validator: function (value) {
return ["succ", "info", "error"].indexof(value) !== -1;
},
},
// 用戶級(jí)別,用于顯示皇冠個(gè)效
userLevel: {
type: String,
required: true,
},
},
};
- 為組件樣式設(shè)置作用域
正例:
<template>
<div class="hello">
HelloWorld
</div>
</template>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.hello {
color: white;
font-size: 22px;
margin: 10px 0 0;
}
</style>
反例:
<template>
<div class="hello">
HelloWorld
</div>
</template>
<!-- 沒有scoped 特性-->
<style >
.hello {
color: white;
font-size: 22px;
margin: 10px 0 0;
}
</style>
- 如果特性元素較多,應(yīng)該主動(dòng)換行
正例:
<MyComponent
foo="a"
bar="b"
baz="c">
</MyComponent>
反例:
<MyComponent foo="a" bar="b" baz="c"></MyComponent>
1.2、模板中使用簡單的表達(dá)式
組件模板應(yīng)該只包含簡單的表達(dá)式,復(fù)雜的表達(dá)式則應(yīng)該重構(gòu)為計(jì)算屬性或方法。復(fù)雜表達(dá)式會(huì)讓你的模極變得不那么聲明式。我們應(yīng)該盡量描述應(yīng)該出現(xiàn)的是什么,而非如何計(jì)算那個(gè)值。而且計(jì)算屬性和方法使得代碼可以重用。
正例:
<template>
<div >
{{ normalizedFullName }}
</div>
</template>
<script>
export default {
name: "HelloWorld",
computed:{
normalizedFullName:function(){
return this.fullName.split(' ').map((word)=>{
return word[0].toUpperCase()+word.split(1)
}).join(' ')
}
}
};
</script>
反例:
<template>
<div >
{{ fullName.split(' ').map((word)=>{
return word[0].toUpperCase()+word.split(1)
}).join(' ')}}
</div>
</template>
1.3、指令都使用縮寫形式
指令推薦都使用縮寫形式,(用 : 表示v·bind: ,用 @ 表示 v-on, 用#表示 v-slot:)
正例:
<input @input="onInput" @focus="onFocus">
反例:
<input v-on:input="onInput" @focus="onFocus">
1.4、 標(biāo)簽順序保持一致
單文件組件應(yīng)該總是讓標(biāo)簽順序保持為
正例:
<template> </template> <script> </script> <style scoped> </style>
反例:
<template> </template> <style scoped> </style> <script> </script>
1.5、必須為 v-for 設(shè)置鍵值 key
1.6、v-show 與 v-if 選擇
如果運(yùn)行時(shí),需要非常顏繁地切換,使用v·show;如果在運(yùn)行時(shí),條件很少改變,使用v-if。
1.7、script 標(biāo)簽內(nèi)部結(jié)構(gòu)順序
components>props>data>compued>watch>filter>鉤子函數(shù)(鉤子函數(shù)按其執(zhí)行順序)>methods
1.8、Vue Router 規(guī)范
- 頁面跳轉(zhuǎn)數(shù)據(jù)傳遞使用路由參數(shù)
頁面跳轉(zhuǎn),例如A頁面跳轉(zhuǎn)到B頁面,需要將A頁面的數(shù)據(jù)傳遞到B頁面,推使用路由參數(shù)進(jìn)行傳參,而不是將需要傳遞的數(shù)據(jù)保存 vuex,然后在 B頁面取出 vuex的數(shù)據(jù),因?yàn)槿绻?B頁面剛新會(huì)導(dǎo)致 vuex 數(shù)據(jù)丟失
正例:
let id='1113'
this.$router.push({name:'userDetail',
query:{
id:id
}
})
- 使用路由懶加載(延遲加載)機(jī)制
{
path: "/Login",
name: "Login",
// 登錄頁
component: () => import('@/components/Login/Login.vue'),
},
3.router 中的命名規(guī)范
path、childrenPoints命名規(guī)范采用kebab-case命名規(guī)范(盡量vue文件的目錄結(jié)構(gòu)保持一致,因?yàn)槟夸?、文件名都是kebab-case,這樣很方便找到對(duì)應(yīng)的文件)
{
path:'/system/system-list',
// 系統(tǒng)列表
name:'SystemList',
component:()=>import('../components/system/system-list.vue')
}
4.router 中的 path 命名規(guī)范
path除了采用kebab-case命名規(guī)范以外,必須以/開頭,即使是children里的path也要以/開頭。如下示例
目的:
經(jīng)常有這樣的場景:某個(gè)頁面有問題,要立刻找到這個(gè)文件,如果不用以/開頭,path為parent和children組成的,可能經(jīng)常需要在router文件里搜索多次才能找到,而如用以/開頭,則能立刻搜索到對(duì)應(yīng)的組件
{
path: '/',
// 首頁
name: 'home',
component: () => import('../components/home/home.vue'),
redirect: '/panel',
// 重定向到看板頁
children:[
{
path:'/panel',
// 大屏面板
name:'Panel',
component:()=>import('../components/panel/panel.vue'),
meta: {
bg: 'bg'
},
// 背景圖
},
{
path:'/system',
// 系統(tǒng)設(shè)置
name:'System',
component:()=>import('../components/system/system.vue')
}]
}
2、Vue 項(xiàng)目目錄規(guī)范
2.1、基礎(chǔ)
vue 項(xiàng)目中的所有命名一定要與后端命名統(tǒng)一。
比如權(quán)限:后端 privilege,前端無論 router,store,api等都必須使用 privielege 單詞!
2.2、使用 Vue-cli 腳手架
使用 vue·cli3 來初始化項(xiàng)目,項(xiàng)目名按照上面的命名規(guī)范
2.3、 目錄說明
目錄名按照上面的命名規(guī)范,其中components 組件用大寫駝峰,其余除components 組件目錄外的所有目錄均便用 kebab-case 合名。
src源碼目錄
|-- api 所有api接口 |-- assets 靜志資源,images,icons,styles等 |-- components 公用組件 |-- config 配置信息 |-- constants 常量信息,項(xiàng)目所有Enun,全局常量等 |-- directives 自定義指令 |-- filters 過濾器,全局工具 |-- datas 模擬教據(jù),臨時(shí)存放 |-- lib 外部引用的插件存放及修改文件 |-- mock 模擬接口,臨時(shí)存放 |-- plugins 插件,全局使用 |-- router 路由,統(tǒng)一管理 |-- store vuex,統(tǒng)一管理 |-- themes 自定義樣式主題 |-- views 視圖目錄 | |-- role role模塊名 | |-- role-list.vue role列表頁面 | |-- role-add. vue role新建頁面 | |-- role-update.vue role更新頁面 | |-- index.less role模塊樣式 | |-- components role模塊通用組件文件夾 | |-- employee employee模塊
1. api 目錄
- 文件、變量命名要與后端保持一致。
- 此目錄對(duì)應(yīng)后端 API 接口,按照后端一個(gè)controller 一個(gè)api.js文件。若項(xiàng)目較大時(shí),可以按照業(yè)務(wù)劃分子目錄,并與后端保持一致。
- api中的方法名字要與后端 api url 盡量保持語義高度一致性。
- 對(duì)于 api中的每個(gè)方法要添加注釋,注釋與后端swagger 接口文檔保持一致。
正例:
后端ulr:EmployeeController.java
/employee/add /employee/delete/id /employee/update
前端:employee.js
//添加員工
addEmployee:(data)=>{
rerutn postAxios('/employee/add',data)
}
//更新員工
updateEmployee:(data)=>{
rerutn postAxios('/employee/update',data)
}
//刪除員工
deleteEmployee:(employeeId)=>{
rerutn postAxios('/employee/delete/'+employeeId)
}
2. assets目錄assels 為靜態(tài)資源,里面存放 images,styles,icons等靜態(tài)資源,靜態(tài)資源命名格式為 kebab-case
|-- assets |-- images | |-- background-color.png | |-- upload-header.png |-- styles
3.components目錄此目錄應(yīng)按照組件進(jìn)行目錄劃分,目錄命名為KebabCase,組件命名規(guī)則也為KebabCase
|-- error-log | |--index.vue | |-- index.less |-- markdow-editor | |--index.vue | |--index.js |-- kebab-case
4.constants 目錄此目錄存放項(xiàng)目所有常量,如果常量在vue 中使用,請使用vue-enum 插件(https://gitee.com/lab1024/vue-enum)
vue-enum目錄結(jié)構(gòu):
|-- index.js |-- role.js |-- employee.js
例子:index.js
export let enumInfo = {
SOURCE_IN_TYPE: {
PURCHASE_IN: {
value: 1,
desc: '采購入庫'
},
REFUND_IN: {
value: 2,
desc: '退貨入庫'
},
CHECK_IN: {
value: 3,
desc: '盤點(diǎn)入庫'
},
CONFIRM_IN: {
value: 4,
desc: '取消訂單入庫'
}
}
}
5.router與store 目錄
這兩個(gè)目錄一定要將業(yè)務(wù)進(jìn)行拆分,不能放到一個(gè)文件里。
router 盡量按照 views 中的結(jié)構(gòu)保持一致
srore 按照業(yè)務(wù)進(jìn)行拆分不同的正文件
6.views 目錄
- 命名要與后端、router、api等保持一致
- components 中組件要使用 Pascalcase 規(guī)則
|-- views 視圖目錄 | |-- role role模塊名 | |-- role-list.vue role列表頁面 | |-- role-add. vue role新建頁面 | |-- role-update.vue role更新頁面 | |-- index.less role模塊樣式 | |-- components role模塊通用組件文件夾 | | |-- role-header.vue role頭部組件 | | |-- role-modal.vue role彈出窗組件 | |-- employee employee模塊 | |-- behavior-log 行為日志log模塊 | |-- code-generator 代碼生成器模塊
2.4、注釋說明
整理必須加注釋的地方
- 公共組件使用說明
- api 目錄的接口js 文件必須加注釋
- store 中的 state,mutation, action等必須加注釋
- vue 文件中的template 必須加注釋,若文件較大添加 slart end 注釋
- vue 文件的 methods,每個(gè)method 必須添加注釋
- vue 文件的 data,非常見單詞要加注釋
2.5、其他
- 盡量不要手動(dòng)操作 DOM
因使用 vue 框架,所以在項(xiàng)目開發(fā)中盡量使用 vue 的數(shù)據(jù)驅(qū)動(dòng)更新 DOM,盡量(不到萬不得已)不要手動(dòng)操作DOM,包括:增刪改 dom 元素、以及更改樣式、添加事件等 - 刪除無用代碼
因使用了 git/svn 等代碼版本工具,對(duì)于無用代碼必須及時(shí)刪除,例如:一些調(diào)試的console 語句、無用的棄用功能代碼.
總結(jié)
到此這篇關(guān)于前端開發(fā)必備小技巧之前端代碼規(guī)范Vue篇的文章就介紹到這了,更多相關(guān)前端代碼規(guī)范Vue篇內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
純javascript實(shí)現(xiàn)選擇框的全選與反選功能
這篇文章主要介紹了純javascript實(shí)現(xiàn)選擇框的全選與反選 ,需要的朋友可以參考下2019-04-04
關(guān)于promise和async用法以及區(qū)別詳解
Promise是一個(gè)構(gòu)造函數(shù),我們就可以new Promise()得到一個(gè) Promise的實(shí)例,下面這篇文章主要給大家介紹了關(guān)于promise和async用法以及區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-01-01
javascript事件函數(shù)中獲得事件源的兩種不錯(cuò)方法
許多情況我們需要獲得事件源對(duì)象來對(duì)其屬性進(jìn)行更改,在事件響應(yīng)函數(shù)中獲得事件源的方法有如下兩種2014-03-03
JS中的算法與數(shù)據(jù)結(jié)構(gòu)之二叉查找樹(Binary Sort Tree)實(shí)例詳解
這篇文章主要介紹了JS中的算法與數(shù)據(jù)結(jié)構(gòu)之二叉查找樹(Binary Sort Tree),結(jié)合實(shí)例形式詳細(xì)分析了二叉查找樹(Binary Sort Tree)的原理、定義、遍歷、查找、插入、刪除等常見操作技巧,需要的朋友可以參考下2019-08-08

