Vue开发规范
規范目的
為提高團隊協作效率
便于后臺人員添加功能及前端后期優化維護
輸出高質量的文檔
命名規范
為了讓大家書寫可維護的代碼,而不是一次性的代碼
讓團隊當中其他人看你的代碼能一目了然
甚至一段時間時候后你再看你某個時候寫的代碼也能看
css命名規范
遵循bem命名規范(bem命名規范官方文檔)
1)塊:具有獨立意義的實體(eg: header、container、menu、form、input)
2) 元素:塊的一部分,沒有獨立意義,與塊語義相關
3)修飾符:塊、元素的修飾標志,使用修飾符更改某些外觀、行為
常用Block命名有:
header、container、menu、form、input …
ui開頭的為通用基礎組件;ui-btn(按鈕),ui-input(輸入框),ui-cell,ui-panel,ui-actionsheet,feed…
業務頁面結合功能進行組件劃分,獨立業務功能組件,組合頁面+功能命名,公用業務抽象業務功能命名;
獨立業務功能組件Block
常用元素Element命名有:
hd(頭部),bd(主體),ft(底部),lt(左側),ct(中間),rt(右側),title(頭部標題),menu(頭部菜單),list(主體列表,)item(主體列表),icon(左側圖標), form、input、submit、checkbox、ridio…
常用Modifier命名有:
default(默認)、primary(主要)、success(成功)、error(失敗)、danger(危險)、warning(警告)、disabled(禁用),checked(選中),fixed(固定),lg(大號),sm(小號)、xs(超小)、yellow,size-big,color-yellow…
js命名規范
普通變量命名:小駝峰命名法
命名必須是跟需求的內容相關的詞
命名是復數的時候需要加s
常量命名:全部大寫
使用大寫字母和下劃線來組合命名,下劃線用以分割單詞
const MAX_COUNT = 10 const URL = 'https://www.baidu.com/'組件命名:
聲明約定:PascalCase (單詞首字母大寫命名)
使用約定:kebab-case (短橫線分隔命名)
method 方法命名命名規范:小駝峰式命名
統一使用動詞或者動詞+名詞形式
請求數據方法,以 data 結尾
init、refresh 單詞除外,盡量使用常用單詞開頭(set、get、go、can、has、is)
壞的命名:go、nextPage、show、open、login
好的命名:jumpPage、openCarInfoDialog、getListData、postFormData
函數方法常用的動詞:
props 命名
聲明的時候始終使用 camelCase
模板中應該始終使用 kebab-case
文件|文件夾命名
名字至少兩個單詞
盡量是名詞,且使用大駝峰命名法
業務模塊開頭的單詞就是所屬模塊名字
公共模塊以業務語義命名
頁面規范
1. 所有頁面必須進行結構化劃分,一個頁面由多個自定義結構塊組成
2. 結構盡可能最小單元化,增強復用,常見基礎結構有button、 input等;
3. 頁面結構一律遵循bem命名規范
4. bem命令的結構,默認樣式不需要嵌套,bem結構內不允許非bem規范的class類出現
5. b跟e之間通過__連接,e跟m之間通過–連接,b、e、m如果是多單詞組合通過-連接,避免多層嵌套連接.block-ext-ext-ext,最多連接三個
.block__elem--mod { } .block-ext__elem-ext--mod-ext { }6. b跟m組合用于擴展結構,通過嵌套覆蓋默認結構樣式
<div class=”block block--mod”><div class=“block__elem”>...</div> </div> .block--mod .block__elem { }7. bem結構內部可以包含多個bem子結構,每個子結構根據唯一性原則可直接掛載根Block,避免多層嵌套
<div class=”block”><div class=“block__tp”><div class=“block__tp-lt”><div class=“block__title”></div></div><div class=“block__tp-rt”><div class=“block__item”></div></div></div><div class=“block__ft”><div class=“block__ft-lt”><div class=“block__ft-title”></div></div><div class=“block__ft-rt”><div class=“block__ft-item”></div></div></div> </div> Bad:. block__tp-lt-title、. block__tp-rt-item Good:根據唯一性原則可優化為 . block__title、. block__ item或. block__ft-title、. block__ft-item8. 最小元素內,可直接復用元素標簽
<div class=”block”><div class=“block__elem”><img src=”” /><span></span><i class=””></i></div> </div> . block__elem img { } . block__elem span { } . block__elem i { }9. 頁面引入使用組件規范:
頁面結合功能進行組件劃分:
通用基礎組件,以ui-開頭命名(ui-btn(按鈕),ui-input(輸入框),ui-cell,ui-panel…)
獨立業務功能組件,以頁面+功能命名(home-header, home-footer…)
公用業務抽象,以業務功能命名
10. vue 頁面文件基本結構
<template><div><!--必須在div中編寫頁面--></div> </template> <script> export default {components : {},data () {return {}},mounted() {},methods: {} } </script> <!--聲明語言,并且添加scoped--> <style lang="scss" scoped> </style>11. vue組件選項順序
- components- props- data- computed- created- mounted- metods- filter- watch12. 多個特性的元素規范:
分多行撰寫,每個特性一行
<imgsrc="https://vuejs.org/images/logo.png"alt="Vue Logo" > <my-componentfoo="a"bar="b"baz="c" > </my-component>元素特性的順序:指令放前面,原生屬性放后面
- 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- is- v-for- key- class- id,ref- name- data-*- src, for, type, href,value,max-length,max,min,pattern- title, alt,placeholder- aria-*, role- required,readonly,disabled結構化規范
目錄文件夾及子文件規范
src 源碼目錄 |-- api 接口,統一管理 |-- assets 靜態資源,統一管理 |-- components 公用組件,全局文件 |-- filters 過濾器,全局工具 |-- icons 圖標,全局資源 |-- datas 模擬數據,臨時存放 |-- lib 外部引用的插件存放及修改文件 |-- mock 模擬接口,臨時存放 |-- router 路由,統一管理 |-- store vuex, 統一管理 |-- views 視圖目錄 | |-- staffWorkbench 視圖模塊名 | |-- |-- staffWorkbench.vue 模塊入口頁面 | |-- |-- indexComponents 模塊頁面級組件文件夾 | |-- |-- components 模塊通用組件文件夾注釋規范
代碼注釋在一個項目的后期維護中顯的尤為重要,所以我們要為每一個被復用的組件編寫組件使用說明,為組件中每一個方法編寫方法說明
務必添加注釋的地方:
源碼風格
統一的編碼規范,可使代碼更易于閱讀,易于理解,易于維護。
盡量按照 ESLint 格式要求編寫代碼
使用 ES6 風格編碼
1. 定義變量使用 let ,定義常量使用 const
2. 靜態字符串一律使用單引號或反引號,動態字符串使用反引號
// badconst a = 'foobar'const b = 'foo' + a + 'bar'// goodconst a = 'foobar'const b = `foo${a}bar`const c = 'foobar'3. 解構賦值
數組成員對變量賦值時,優先使用解構賦值
// 數組解構賦值const arr = [1, 2, 3, 4]// badconst first = arr[0]const second = arr[1]// goodconst [first, second] = arr函數的參數如果是對象的成員,優先使用解構賦值
// 對象解構賦值// badgetFullName(user) {const firstName = user.firstNameconst lastName = user.lastName}// goodgetFullName(obj) {const { firstName, lastName } = obj}4.拷貝數組 :使用擴展運算符(…)拷貝數組
const items = [1, 2, 3, 4, 5]// badconst itemsCopy = items// goodconst itemsCopy = [...items]5.箭頭函數
需要使用函數表達式的場合,盡量用箭頭函數代替。因為這樣更簡潔,而且綁定了 this
// badconst self = this;const boundMethod = function(...params) {return method.apply(self, params);}// acceptableconst boundMethod = method.bind(this);// bestconst boundMethod = (...params) => method.apply(this, params);6.模塊
如果模塊只有一個輸出值,就使用 export default,如果模塊有多個輸出值,就不使用 export default,export default 與普通的 export 不要同時使用
// badimport * as myObject from './importModule'// goodimport myObject from './importModule'如果模塊默認輸出一個函數,函數名的首字母應該小寫。
function makeStyleGuide() {}export default makeStyleGuide;如果模塊默認輸出一個對象,對象名的首字母應該大寫。
const StyleGuide = {es6: {}};export default StyleGuide;組合輸出對象
util.js const StyleGuide = {es6: {} }; function makeStyleGuide() {} export default {StyleGuide,makeStyleGuide }使用: import Utils from './util'let msg = Utils.StyleGuide Utils.makeStyleGuide()指令規范
1. 指令有縮寫一律采用縮寫形式
// badv-bind:class="{'show-left':true}"v-on:click="getListData"// good:class="{'show-left':true}"@click="getListData"2. v-for 循環必須加上 key 屬性,在整個 for 循環中 key 需要唯一
<!-- bad --><ul><li v-for="todo in todos">{{ todo.text }}</li></ul><!-- good --><ul><li v-for="todo in todos" :key="todo.id">{{ todo.text }}</li></ul>3.避免 v-if 和 v-for 同時用在一個元素上(性能問題)
以下為兩種解決方案:
將數據替換為一個計算屬性,讓其返回過濾后的列表
將 v-if 移動至容器元素上 (比如 ul, ol)
<!-- good --><ul v-if="shouldShowUsers"><li v-for="user in users" :key="user.id">{{ user.name }}</li></ul>其他
1. 避免 this.$parent
2.調試信息 console.log() debugger 使用完及時刪除
3.除了三目運算,if,else 等禁止簡寫
// badif (true)alert(name);console.log(name)// goodif (true) {alert(name);}console.log(name);CSS 規范
通用規范
sass 規范
當使用 Sass 的嵌套功能的時候,重要的是有一個明確的嵌套順序,以下內容是一個 SCSS 塊應具有的順序。
特殊規范
對用頁面級組件樣式,應該是有作用域的
對于公用組件或者全局組件庫,我們應該更傾向于選用基于 class 的 BEM 策略
總結
- 上一篇: 2022数学建模“五一杯”B题 题解+论
- 下一篇: Workbox.routing v3.x