全手打原創,轉載請標明出處:https://www.cnblogs.com/dreamsqin/p/10906951.html,多謝,=。=~
必要的:規避錯誤;
強烈推薦:改善可讀性和開發體驗;
推薦:多選擇情況下建議一個默認的選擇;
謹慎使用:照顧極端情況或幫助老代碼平穩遷移的vue特性;
以下包括Vue官網表示必要的和強烈推薦的
一、命名規范
1、組件名為多個單詞,除根組件App外——避免跟現有的以及未來的 HTML 元素沖突。
2、在插件、混入等擴展中始終為自定義的私有屬性使用 $_ 前綴(或使用模塊作用域,保證不允許外部訪問的函數的私有性)。通常為:
3、單文件組件的文件名要么是單詞大寫開頭 (PascalCase),要么是橫線連接 (kebab-case)——單詞大寫開頭利於代碼編輯器的自動補全。
4、應用特定樣式和約定的基礎組件 (也就是展示類的、無邏輯的或無狀態的組件) 應該全部以一個特定的前綴開頭,比如 Base、App 或 V——編輯器排序后基礎組件會全部列在一起,防止隨意選擇前綴,被頻繁使用放全局時相同前綴易於webpack打包。
5、只應該擁有單個活躍實例的組件(即每個頁面只使用一次該組件,它不接受prop)應該以 The 前綴命名,以示其唯一性——例如頭heading、導航欄sidebar。
6、和父組件緊密耦合的子組件應該以父組件名作為前綴命名(一個組件只在某個父組件的場景下有意義)——通常目錄嵌套的方法文件名相同時在編輯器中快速切換文件困難,過多嵌套的子目錄增加瀏覽組件所花的時間。
7、組件名中單詞的順序應該以高級別的 (通常是一般化描述的) 單詞開頭,以描述性的修飾詞結尾。比如:
8、組件名大小寫:對於絕大多數項目來說,在單文件組件和字符串模板中組件名應該總是 PascalCase 的——但是在 DOM 模板中總是 kebab-case 的(HTML 是大小寫不敏感的)。
ESLint:
{ "vue/component-name-in-template-casing": ["error", "kebab-case", { "registeredComponentsOnly": false, "ignores": [] }] }
9、JS/JSX 中的組件名應該始終是 PascalCase 的,盡管在較為簡單的應用中只使用 Vue.component 進行全局組件注冊時,可以使用 kebab-case 字符串。
ESLint:
{ "vue/name-property-casing": ["error", "PascalCase"] }
10、組件名應該傾向於完整單詞而不是縮寫。
11、prop名大小寫:在聲明 prop 的時候,其命名應該始終使用 camelCase,而在模板和 JSX 中應該始終使用 kebab-case。
ESLint:
{ "vue/prop-name-casing": ["error", "camelCase"] }
PS:對於駝峰和橫線命名的選擇可以總體遵循:在 JavaScript 中是 camelCase,在 HTML 中則是 kebab-case。
二、其他
1、組件的 data 必須是一個函數,除了 new Vue 外的任何地方。
2、props定義盡量詳細。通常為:
ESLint:
{ "vue/require-prop-types": "error" }
3、給v-for設置鍵值,與key結合使用,可以高效的更新虛擬DOM(使用數組中不會變化的那一項作為key值)。通常為:
ESLint:
{ "vue/require-v-for-key": "error" }
4、不要把 v-if 和 v-for 用在同一個元素上——因為v-for 比 v-if 具有更高的優先級。
ESLint:
{ "vue/no-use-v-if-with-v-for": ["error", { "allowUsingIterationVar": false }] }
5、為單文件組件樣式設置作用域,傾向於選用基於 class 的策略(css modules)而不是 scoped 特性。通常為:
6、把每個組件單獨拆分成文件,即一個組件為一個.vue文件。
7、在單文件組件、字符串模板和 JSX 中沒有內容的組件應該是自閉合的(自閉合組件表示它們不僅沒有內容,而且刻意沒有內容)——但在 DOM 模板里永遠不要這樣做。
8、多個特性的元素應該分多行撰寫,每個特性一行。通常為:
ESLint:
{ "vue/max-attributes-per-line": ["error", { "singleline": 1, "multiline": { "max": 1, "allowFirstLine": false } }] }
9、組件模板應該只包含簡單的表達式,復雜的表達式則應該重構為計算屬性或方法。例如:
10、應該把復雜計算屬性分割為盡可能多的更簡單的屬性——易於測試、閱讀、更好的“擁抱變化”(需求變更時重構量小)。例如:
11、非空 HTML 特性值應該始終帶引號 (單引號或雙引號,選你 JS 里不用的那個)。
12、指令縮寫 (用 : 表示 v-bind: 和用 @ 表示 v-on:) 應該要么都用要么都不用。
ESLint:
{ "vue/v-bind-style": ["error", "shorthand"], "vue/v-on-style": ["error", "shorthand"] }
以下包括Vue官網表示推薦的
1、組件/實例的選項的順序
- name
- components
- mixins
- props
- data
- computed
- watch
- 生命周期鈎子 (按照它們被調用的順序)
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
activated
deactivated
beforeDestroy
destroyed
- methods
ESLint:
{ "vue/order-in-components": ["error", { "order": [ "el", "name", "parent", "functional", ["delimiters", "comments"], ["components", "directives", "filters"], "extends", "mixins", "inheritAttrs", "model", ["props", "propsData"], "data", "computed", "watch", "LIFECYCLE_HOOKS", "methods", ["template", "render"], "renderError" ] }] }
2、元素/組件特性的順序
- v-for
- v-if
- v-else-if
- v-else
- v-show
- id
- ref
- key
- slot
- v-model
- 其他特性(所有普通的綁定或未綁定的特性)
- v-on
ESLint:
{ "vue/attributes-order": ["error", { "order": [ "DEFINITION", "LIST_RENDERING", "CONDITIONALS", "RENDER_MODIFIERS", "GLOBAL", "UNIQUE", "TWO_WAY_BINDING", "OTHER_DIRECTIVES", "OTHER_ATTR", "EVENTS", "CONTENT" ] }] }
3、組件/實例選項中的空行
4、單文件組件頂級元素的順序
- <script>/* ... */</script>
- <template>...</template>
- <style>/* ... */</style>
或
- <template>...</template>
- <script>/* ... */</script>
- <style>/* ... */</style>
以下包括Vue官網表示謹慎使用的
1、沒有在 v-if/v-else-if/v-else 中使用 key;
2、元素選擇器在 scoped 中出現(盡可能選用類選擇器);
3、隱性的父子組件通信(應該優先通過 prop 和事件進行父子組件之間的通信,而不是 this.$parent 或改變 prop,理想狀態是prop 向下傳遞,事件向上傳遞的);
4、應該優先通過 Vuex 管理全局狀態,而不是通過 this.$root 或一個全局事件總線;
參考資料
vue官方風格指南:https://cn.vuejs.org/v2/style-guide/
eslint-plugin-vue:https://eslint.vuejs.org/rules/