學會VUE的這些編碼規範,讓你的代碼質量提高一個等級

個人網站: www.dzyong.top
公衆號: 【前端筱園】
做者:鄧佔勇

編碼規範看看起來和實現項目功能並無太大的聯繫,可是爲何它仍是顯得如此的重要呢。它主要有三大要素:可讀性,可維護性,可變動性。javascript

一個團隊統一了編碼規範,能夠大大的提升開發效率與交互效率,能夠很容易的看懂他人寫的代碼,使後期的維護也變得更加簡單。今天來說講VUE只的編碼規範。分爲三個等級:必要的、強烈推薦、謹慎使用前端

1、必要的

1. 組件名爲多個單詞,而不是一個單詞vue

反例java

Vue.component('todo', {
  // ...
})
export default {
  name: 'Todo',
  // ...
}

正例ide

Vue.component('todo-item', {
  // ...
})
export default {
  name: 'TodoItem',
  // ...
}

2. 組件的data必須是一個函數函數

反例網站

export default {
  data: {
    name: 'dzy'
  }
}

正例ui

export default {
  data() {
    return {
      name: 'dzy'    
    }
  }
}

3. prop的定義應該儘可能詳細,至少須要指定類型this

反例編碼

props: ['status']

正例

props:{
  name: {
    type: String,
    default: 'dzy',
    required: true    
  }
}

4. 爲v-for設置鍵值,老是用key配合v-for

反例

<ul>
  <li v-for="todo in todos">
    {{ todo.text }}
  </li>
</ul>

正例

<ul>
  <li
    v-for="todo in todos"
    :key="todo.id"
  >
    {{ todo.text }}
  </li>
</ul>

5. 永遠不要把v-if與v-for用在同一個元素上

反例

<ul>
  <li
    v-for="user in users"
    v-if="shouldShowUsers"
    :key="user.id"
  >
    {{ user.name }}
  </li>
</ul>

正例

<ul v-if="shouldShowUsers">
  <li
    v-for="user in users"
    :key="user.id"
  >
    {{ user.name }}
  </li>
</ul>

6. 爲組件樣式設置做用域

反例

<style>
.btn-close {
  background-color: red;
}
</style>
正例

<style scoped>
.button {
  border: none;
  border-radius: 2px;
} 
</style>

7. 私有屬性名

Vue 使用 _ 前綴來定義其自身的私有屬性,因此使用相同的前綴 (好比 _update) 有覆寫實例屬性的風險。即使你檢查確認 Vue 當前版本沒有用到這個屬性名,也不能保證和未來的版本沒有衝突。

對於 $ 前綴來講,其在 Vue 生態系統中的目的是暴露給用戶的一個特殊的實例屬性,因此把它用於私有屬性並不合適。

不過,咱們推薦把這兩個前綴結合爲 $_,做爲一個用戶定義的私有屬性的約定,以確保不會和 Vue 自身相沖突。

正例

var myGreatMixin = {
  // ...
  methods: {
    update: function () {
      // ...
    }
  }
}
var myGreatMixin = {
  // ...
  methods: {
    _update: function () {
      // ...
    }
  }
}
var myGreatMixin = {
  // ...
  methods: {
    $update: function () {
      // ...
    }
  }
}

正例

var myGreatMixin = {
  // ...
  methods: {
    $_myGreatMixin_update: function () {
      // ...
    }
  }
}
// 甚至更好!
var myGreatMixin = {
  // ...
  methods: {
    publicMethod() {
      // ...
      myPrivateFunction()
    }
  }
}
​
function myPrivateFunction() {
  // ...
}
​
export default myGreatMixin

2、強烈推薦

1. 把每一個組件獨立成一個文件

反例

Vue.component('TodoList', {
  // ...
})
​
Vue.component('TodoItem', {
  // ...
})

正例

components/
|- TodoList.vue
|- TodoItem.vue

2. 單文件的組件名必定是大寫開頭或者以「-」鏈接

反例

components/
|- mycomponent.vue
components/
|- myComponent.vue

正例

components/
|- MyComponent.vue
components/
|- my-component.vue

3. 特定樣式或基礎組件,應該以同一個公共前綴開頭

反例

components/
|- MyButton.vue
|- VueTable.vue
|- Icon.vue

正例

components/
|- BaseButton.vue
|- BaseTable.vue
|- BaseIcon.vue
components/
|- AppButton.vue
|- AppTable.vue
|- AppIcon.vue

4. 若是一個組件是一個定製組件,即它不是一個公共組件,這種組件名應以The開頭,表示惟一性,它不該該接收任何prop,若是接收prop那麼說明它是一個公共組件

反例

components/
|- Heading.vue
|- MySidebar.vue

正例

components/
|- TheHeading.vue
|- TheSidebar.vue

5.和父組件緊密耦合子組件,應以父組件名做爲前綴名

反例

components/
|- TodoList.vue
|- TodoItem.vue
|- TodoButton.vue

正例

components/
|- TodoList.vue
|- TodoListItem.vue
|- TodoListItemButton.vue

6. 組件名應以高級別的單詞開頭,以描述性的修飾詞結尾

反例

components/
|- ClearSearchButton.vue
|- ExcludeFromSearchInput.vue
|- LaunchOnStartupCheckbox.vue
|- RunSearchButton.vue
|- SearchInput.vue
|- TermsCheckbox.vue

正例

components/
|- SearchButtonClear.vue
|- SearchButtonRun.vue
|- SearchInputQuery.vue
|- SearchInputExcludeGlob.vue
|- SettingsCheckboxTerms.vue
|- SettingsCheckboxLaunchOnStartup.vue

7. 在單文件組件、字符模板和JSX中沒有內容的組件應該是自閉和的,可是在DOM模板裏永遠不要這麼作

反例

<!-- 在單文件組件、字符串模板和 JSX 中 -->
<MyComponent></MyComponent>
<!-- 在 DOM 模板中 -->
<my-component/>

正例

<!-- 在單文件組件、字符串模板和 JSX 中 -->
<MyComponent/>
<!-- 在 DOM 模板中 -->
<my-component></my-component>

8. JS/JSX中的組件名應爲駝峯命名

反例

Vue.component('myComponent', {
  // ...
})
import myComponent from './MyComponent.vue'
export default {
  name: 'myComponent',
  // ...
}
export default {
  name: 'my-component',
  // ...
}

正例

Vue.component('MyComponent', {
  // ...
})
Vue.component('my-component', {
  // ...
})
import MyComponent from './MyComponent.vue'
export default {
  name: 'MyComponent',
  // ...
}

9. 組件名應爲完整的英文單詞,而不是縮寫

反例

components/
|- SdSettings.vue
|- UProfOpts.vue

正例

components/
|- StudentDashboardSettings.vue
|- UserProfileOptions.vue
​```


**v10. 在聲明prop的時候,名稱應爲駝峯命名,而在模板和JSX應用中應該是kebab-case**

反例

props: {
'greeting-text': String
}
<WelcomeMessage greetingText="hi"/>

正例

props: {
greetingText: String
}
<WelcomeMessage greeting-text="hi"/>

**11. 多個attribute的元素應該分多行撰寫,每一個attribute一行**

反例

<img src="https://vuejs.org/images/logo.png" alt="Vue Logo">
<MyComponent foo="a" bar="b" baz="c"/>
正例

<img
src="https://vuejs.org/images/logo.png"
alt="Vue Logo"

<MyComponent
foo="a"
bar="b"
baz="c"
/>
**12. 組件模板應該只包含簡單的表達式,複雜的表達式應該重構爲計算屬性或方法**

反例

{{
fullName.split(' ').map(function (word) {

return word[0].toUpperCase() + word.slice(1)

}).join(' ')
}}

正例

<!-- 在模板中 -->
{{ normalizedFullName }}
// 複雜表達式已經移入一個計算屬性
computed: {
normalizedFullName: function () {

return this.fullName.split(' ').map(function (word) {
  return word[0].toUpperCase() + word.slice(1)
}).join(' ')

}
}
`

13. 應該把複雜的計算屬性,分割爲很可能多的計算屬性
反例

computed: {
  price: function () {
    var basePrice = this.manufactureCost / (1 - this.profitMargin)
    return (
      basePrice -
      basePrice * (this.discountPercent || 0)
    )
  }
}

正例

computed: {
  basePrice: function () {
    return this.manufactureCost / (1 - this.profitMargin)
  },
  discount: function () {
    return this.basePrice * (this.discountPercent || 0)
  },
  finalPrice: function () {
    return this.basePrice - this.discount
  }
}

14. 非空的attitude值應該始終帶引號

反例

<input type=text>
<AppSidebar :style={width:sidebarWidth+'px'}>
正例

<input type="text">
<AppSidebar :style="{ width: sidebarWidth + 'px' }">

15. 指令能夠縮寫的建議縮寫

<input
  v-bind:value="newTodoText"
  :placeholder="newTodoInstructions"
>
<input
  v-on:input="onInput"
  @focus="onFocus"
>
<template v-slot:header>
  <h1>Here might be a page title</h1>
</template>
​
<template #footer>
  <p>Here's some contact info</p>
</template>

歡迎訪問個人網站:www.dzyong.top,關注個人公衆號【前端筱園】,不錯過個人每一篇推送

3、謹慎使用

1. 同一組的v-if和v-else最好使用key標識

什麼意思呢,咱們咋使用v-if和v-else時,都是成組出現的,當咱們在一個上下文中,屢次使用到v-if和v-else,這很容易引發混亂,很難看出那個v-else是屬於那個v-else的。添加key標識還能夠提升更新DOM的效率

<div
  v-if="error"
  key="search-status"
>
  錯誤:{{ error }}
</div>
<div
  v-else
  key="search-results"
>
  {{ results }}
</div>

2. 元素選擇器應該避免在scoped 中出現

在scoped樣式中,類選擇器比元素選擇器很好,大量使用元素選擇器是很慢的。

這是由於VUE在爲了給樣式設置做用域,vue會爲元素添加一個惟一的attribute,以下圖所示。而後修改選擇器,使得元素選擇器的元素中,只有帶這個attribute的元素纔會生效,因此大量使用元素+attribute組合的選擇器,比類+attribute組合的選擇器所涉及的元素更多,也就致使更慢。

3. 應該優先使用prop進行父子組件間的通訊,而不是使用this$parent或改變prop

4. 應該優先使用VUEX管理全局狀態,而不是經過this.$root或一個全局事件總線

gzh-code1.7a76f156.jpg

相關文章
相關標籤/搜索