Dieses Mal werde ich Ihnen die Spezifikationen für die Vue-Frontend-Entwicklung und die Vorsichtsmaßnahmen für die Vue-Frontend-Entwicklungsspezifikationen vorstellen. Das Folgende ist ein praktischer Fall, schauen wir uns das an.
Basierend auf dem offiziellen Vue-Styleguide
1
Komponentennamen sollten immer aus mehreren Wörtern bestehen, mit Ausnahme der Stammkomponente App.
Positivbeispiel:
export default { name: 'TodoItem', // ... } 反例: export default { name: 'Todo', // ... }
2. Komponentendaten
Die Daten der Komponente müssen eine Funktion sein.
Bei Verwendung des Datenattributs in einer Komponente (irgendwo außer New Vue) muss sein Wert eine Funktion sein, die ein Objekt zurückgibt.
Positivbeispiel:
// In a .vue file export default { data () { return { foo: 'bar' } } } // 在一个 Vue 的根实例上直接使用对象是可以的, // 因为只存在一个这样的实例。 new Vue({ data: { foo: 'bar' } })
Gegenbeispiel:
export default { data: { foo: 'bar' } }
3. Requisitendefinition
Die Requisitendefinition sollte so detailliert wie möglich sein.
In dem von Ihnen übermittelten Code sollte die Definition von „prop“ so detailliert wie möglich sein und zumindest den Typ angeben.
Positivbeispiel:
props: { status: String } // 更好的做法! props: { status: { type: String, required: true, validator: function (value) { return [ 'syncing', 'synced', 'version-conflict', 'error' ].indexOf(value) !== -1 } } }
Gegenbeispiel:
// 这样做只有开发原型系统时可以接受 props: ['status']
4. Schlüsselwert für v-for festlegen
Schlüssel immer mit v-for verwenden.
Key muss immer mit v-for für eine Komponente verwendet werden, um den Status der internen Komponente und ihrer Unterbäume beizubehalten. Selbst die Beibehaltung eines vorhersehbaren Verhaltens von Elementen, wie z. B. der Objektkonstanz in Animationen, ist eine gute Vorgehensweise.
Positivbeispiel:
<ul> <li v-for="todo in todos" :key="todo.id" > {{ todo.text }} </li> </ul>
Gegenbeispiel:
<ul> <li v-for="todo in todos"> {{ todo.text }} </li> </ul>
5. Vermeiden Sie die gemeinsame Verwendung von v-if und v-for
Verwenden Sie niemals v-if und v -for werden gleichzeitig für dasselbe Element verwendet.
Im Allgemeinen tun wir dies in zwei häufigen Situationen:
Um Elemente in einer Liste zu filtern (z. B. v-for="user in users" v-if="user.isActive"
). Ersetzen Sie in diesem Fall „users“ durch eine berechnete Eigenschaft (z. B. „activeUsers“), die die gefilterte Liste zurückgibt.
Um das Rendern von Listen zu vermeiden, die ausgeblendet werden sollten (z. B. v-for="user in users" v-if="shouldShowUsers
"). Verschieben Sie in diesem Fall bitte das v-if in das Containerelement (z. B. ul, ol).
Positivbeispiel:
<ul v-if="shouldShowUsers"> <li v-for="user in users" :key="user.id" > {{ user.name }} </li> </ul>
Gegenbeispiel:
<ul> <li v-for="user in users" v-if="shouldShowUsers" :key="user.id" > {{ user.name }} </li> </ul>
6. Legen Sie den Bereich für Komponentenstile fest
Für Anwendungen können Stile in App-Komponenten und Layoutkomponenten der obersten Ebene global sein. aber alle anderen Komponenten sollten einen Gültigkeitsbereich haben.
Diese Regel gilt nur für Einzeldateikomponenten. Sie müssen das Gültigkeitsbereichsattribut nicht verwenden, um Bereiche über CSS-Module festzulegen. Natürlich können Sie auch andere Bibliotheken oder Konventionen verwenden
In jedem Fall sollten wir für Komponentenbibliotheken lieber klassenbasierte Strategien anstelle von bereichsbezogenen Funktionen verwenden >
Dies erleichtert das Überschreiben interner Stile : Verwendung von für Menschen lesbaren Klassennamen ohne hohe Selektorpriorität, die weniger Konflikte verursachen Beispiel:
<template> <button class="c-Button c-Button--close">X</button> </template> <!-- 使用 BEM 约定 --> <style> .c-Button { border: none; border-radius: 2px; } .c-Button--close { background-color: red; } </style>
<template> <button class="btn btn-close">X</button> </template> <style> .btn-close { background-color: red; } </style> <template> <button class="button button-close">X</button> </template> <!-- 使用 `scoped` 特性 --> <style scoped> .button { border: none; border-radius: 2px; } .button-close { background-color: red; } </style>
Wenn Sie eine Komponente bearbeiten oder die Verwendung einer Komponente überprüfen müssen, können Sie sie schneller finden
components/ |- TodoList.vue |- TodoItem.vue
V ue.component('TodoList', { // ... }) Vue.component('TodoItem', { // ... })
components/ |- MyComponent.vue
components/ |- myComponent.vue |- mycomponent.vue
components/ |- BaseButton.vue |- BaseTable.vue |- BaseIcon.vue
这不意味着组件只可用于一个单页面,而是每个页面只使用一次。这些组件永远不接受任何 prop,因为它们是为你的应用定制的,而不是它们在你的应用中的上下文。如果你发现有必要添加 prop,那就表明这实际上是一个可复用的组件,只是目前在每个页面里只使用一次。
正例:
components/ |- TheHeading.vue |- TheSidebar.vue
反例:
components/ |- Heading.vue |- MySidebar.vue
5. 紧密耦合的组件名
和父组件紧密耦合的子组件应该以父组件名作为前缀命名。
如果一个组件只在某个父组件的场景下有意义,这层关系应该体现在其名字上。因为编辑器通常会按字母顺序组织文件,所以这样做可以把相关联的文件排在一起。
正例:
components/ |- TodoList.vue |- TodoListItem.vue |- TodoListItemButton.vue components/ |- SearchSidebar.vue |- SearchSidebarNavigation.vue
反例:
components/ |- SearchSidebar.vue |- NavigationForSearchSidebar.vue
6. 组件名中的单词顺序
组件名应该以高级别的 (通常是一般化描述的) 单词开头,以描述性的修饰词结尾。
正例:
components/ |- SearchButtonClear.vue |- SearchButtonRun.vue |- SearchInputQuery.vue |- SearchInputExcludeGlob.vue |- SettingsCheckboxTerms.vue |- SettingsCheckboxLaunchOnStartup.vue
反例:
components/ |- ClearSearchButton.vue |- ExcludeFromSearchInput.vue |- LaunchOnStartupCheckbox.vue |- RunSearchButton.vue |- SearchInput.vue |- TermsCheckbox.vue
7. 模板中的组件名大小写
总是 PascalCase 的
正例:
<!-- 在单文件组件和字符串模板中 --> <MyComponent/>
反例:
<!-- 在单文件组件和字符串模板中 --> <mycomponent/> <!-- 在单文件组件和字符串模板中 --> <myComponent/>
8. 完整单词的组件名
组件名应该倾向于完整单词而不是缩写。
正例:
components/ |- StudentDashboardSettings.vue |- UserProfileOptions.vue
反例:
components/ |- SdSettings.vue |- UProfOpts.vue
9. 多个特性的元素
多个特性的元素应该分多行撰写,每个特性一行。
正例:
<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"/>
10. 模板中简单的表达式
组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。
复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。
正例:
<!-- 在模板中 --> {{ normalizedFullName }} // 复杂表达式已经移入一个计算属性 computed: { normalizedFullName: function () { return this.fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') } }
反例:
{{ fullName.split(' ').map(function (word) { return word[0].toUpperCase() + word.slice(1) }).join(' ') }}
11. 简单的计算属性
正例:
computed: { basePrice: function () { return this.manufactureCost / (1 - this.profitMargin) }, discount: function () { return this.basePrice * (this.discountPercent || 0) }, finalPrice: function () { return this.basePrice - this.discount } }
反例:
computed: { price: function () { var basePrice = this.manufactureCost / (1 - this.profitMargin) return ( basePrice - basePrice * (this.discountPercent || 0) ) } }
12. 带引号的特性值
非空 HTML 特性值应该始终带引号 (单引号或双引号,选你 JS 里不用的那个)。
在 HTML 中不带空格的特性值是可以没有引号的,但这样做常常导致带空格的特征值被回避,导致其可读性变差。
正例:
<AppSidebar :style="{ width: sidebarWidth + 'px' }">
反例:
<AppSidebar :style={width:sidebarWidth+'px'}>
13. 指令缩写
都用指令缩写 (用 : 表示 v-bind: 和用 @ 表示 v-on:)
正例:
<input @input="onInput" @focus="onFocus" >
反例:
<input v-bind:value="newTodoText" :placeholder="newTodoInstructions" >
1. 单文件组件的顶级元素的顺序
单文件组件应该总是让