查看 Vue官方 风格指南,记录下我的学习笔记。
优先级 A 的规则: 必要的(规避错误)
1、组件名为多个单词,根组件‘App’除外
Vue.component( 'todo-item', {
// .....
})
export default {
name: 'todoItem',
// ......
}
2、组件的 data 必须是一个函数
export default {
data () {
return {
foo: 'bar',
// .......
}
}
}
// 在一个Vue 的根实例上直接使用对象是可以的,因为只存在一个这样的实例
new Vue ({
data: {
foo: 'bar'
}
})
3、Prop 定义应该尽量详细
props: {
status: String
}
4、为 v-for 设置键值 ,总是用 key 配合 v-for
<ul>
<li
v-for = "todo in todos"
:key = "todo.id"
>
{{ todo.text }}
</li>
</ul>
5、避免 v-if 和 v-for 用在同一个元素上
<ul v-if = "shouldShowUsers">
<li
v-for = "user in users"
:key = "user.id"
>
{{ user.name }}
</li>
</ul>
6、为组件设置作用域 ,添加组件专属前缀
不管怎样,对于组件库,我们应该更倾向于选用基于 class 的 (BEM) 策略而不是 scoped 特性。
使用 ‘scoped’ 特性
<template>
<button class= "button button-colse" > buttonName </button>
</template>
// 使用 ‘scoped’ 特性
<style scoped>
.button {
border: none;
border-radius: 2px;
}
.button-close {
background-color: red;
}
</style>
// 使用 CSS Modules
<template>
<button :class= "[$style.button, $style.buttonClose]"> buttonName </button>
</template>
// 使用 CSS Modules
<style module>
.button {
border: none;
border-radius: 2px;
}
.buttonClose {
background-color: red;
}
</style>
// 使用 BEM 约定
<template>
<button class= "c-Button c-Button--close"> buttonName </button>
</template>
// 使用 BEM 约定
<style>
.c-Button {
border: none;
border-radius: 2px;
}
c-Button--close {
background-color: red;
}
</style>
7、私有属性名
在插件、混入等扩展中始终为自定义的私有属性所用 $_ 前缀,并附带一个命名空间以回避和其他作者的冲突(比如 $_yourPluginName_)
var myGreatMixin = {
// ... ...
methods: {
$_myGreatMixin_update: function () {
// ... ...
}
}
}
优先级B的规则: 强烈推荐 (增强可读性)
1、组件文件 (拆分功能,放到统一功能目录下)
只有有能够拼接文件的构建系统,就把每个组件单独分成文件
components/
|- TodoList.js
|- TodoItem.js
components/
|- TodoList.vue
|- TodoItem.vue
2、单文件组件文件的大小写(统一文件名的命名规范)
单文件组件的文件名 要么使用单词大写开头(PascalCase)
components/
|- MyComponent.vue
要么使用横线连接(kebab-case)
components/
|- my-component.vue
3、基础组件名
应用特定样式和约定的基础组件 (也就是展示类的、无逻辑的或无状态的组件) 应该全部以一个特定的前缀开头,比如 Base 、App 或 V。
// Base 前缀开头
components/
|- BaseButton.vue
|- BaseTable.vue
|- BaseIcon.vue
// App 前缀开头
components/
|- AppButton.vue
|- AppTable.vue
|- AppIcon.vue
// V 前缀开头
components/
|- VButton.vue
|- VTable.vue
|- VIcon.vue
4、单利组件名
只应该拥有单个活跃实例的组件应该以 The 前缀命名,以示其唯一性
这不意味着组件只可用于一个单页面,而是每个页面只使用一次。这些组件永远不接受任何 prop,因为它们是为你的应用定制的,而不是它们在你的应用中的上下文。如果你发现有必要添加 prop,那就表明这实际上是一个可复用的组件。
components/
|- TheHeading.vue
|- TheSidebar.vue
5、紧密耦合的组件名
和父组件紧密耦合的子组件应该以父组件名作为前缀命名。
components/
|- TodoList.vue
|- TodoListItem.vue
|- TodoListItemButton.vue
components/
|- SearchSidebar.vue
|- SearchSidebarNavigation.vue
6、组件名中的单词顺序
组件名应该以高级别的(通常是一般化描述的)单词开头,以描述性的修饰词结尾
components/
|- SearchButtonClear.vue
|- SearchButtonRun.vue
|- SearchInputQuery.vue
|- SearchInputExcludeGlob.vue
|- SettingsCheckboxTerms.vue
|- SettingsCheckboxLaunchOnStartup.vue
7、自闭合组件
在单文件组件、字符串模板和JSX中没有内容的组件应该是自闭合的--但在DOM模板里永远不要这么做。
HTML 并不支持自闭合的自定义元素——只有官方的“空”元素。所以上述策略仅适用于进入 DOM 之前 Vue 的模板编译器能够触达的地方,然后再产出符合 DOM 规范的 HTML。
// 在单文件组件、字符串模板和 JSX 中
<MyComponent />
// 在 DOM 模板中
<my-component> </my-component>
8、模板中组件名的大小写
对于绝大多数项目来说,在单文件组件和字符串模板中组件名应该总是 PascalCase 的——但是在 DOM 模板中总是 kebab-case 的。
// 在单文件组件和字符串模板中
<MyComponent />
// 在 DOM 模板中 或者在所有地方
<my-component> </my-component>
9、JS/JSX 中的组件名大小写
Vue.component ('MyComponent', {
// ...
})
import MyComponent from './MyComponent.vue'
export dafault {
name: 'MyComponent',
// ...
}
10、 完整单词的组件名 (不建议使用缩写)
components/
|- StudentDashboardSettings.vue
|- UserProfileOptions.vue
11、Prop 名大小写 (驼峰命名)
props: {
greetingText: String
}
<WelcomeMessage greeting-text="hi" />
12、多个特性的元素
多个特性的元素应该分多行撰写,每个特性一行
<img
src = "https://vuejs.org/images/logo.png"
alt = "Vue Logo"
>
<MyComponent
foo="a"
bar="b"
baz="c"
/>
13、模板中简单的表达式
组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法
// 在模板中
{{ normalizedFullName }}
// 复杂表达式已经移入一个计算属性
computed: {
normalizedFullName: function () {
return this.fullName.split('').map(funcation (word) {
return word[0].toUpperCase() + word.slice(1)
}).join('')
}
}
14、简单的计算属性
更简单、命名得当的计算属性遵循的原则是:
易于测试
易于阅读
更好的“拥抱变化”
computed: {
basePrice: function () {
return this.manufactureCost / (1 - this.profitMargin)
},
discount: function () {
return this.basePrice * (this.discountPercent || 0)
},
finalPrice: function () {
return this.basePrice - this.discount
}
}
15、带引号的特性值
非空 HTML 特性值应该始终带引号 (单引号或双引号,选你 JS 里不用的那个)。
<input type="text">
<AppSidebar :style="{width: sidebarWidth + 'px' }" >
16、指令缩写
(用 : 表示 v-bind:和 用 @ 表示 v-on:)用法应该统一
<input
:value = "newTodoText"
:placeholder="newTodoInstructions"
>
<input
v-bind:value = "newTodoText"
v-bind:placeholder="newTodoInstructions"
>
<input
@input = "onInput"
@focus ="onFocus"
>
<input
v-on:input = "onInput"
v-on:focus ="onFocus"
>
剩余两项代码书写规则,大家可以查阅Vue官网。