ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 1.组件名为多个单词,根组件 App 和内置组件 \<transition> \<component> 等除外 ```js // bad Vue.component('todo', { // ... }) export default { name: 'Todo', // ... } // good Vue.component('todo-item', { // ... }) export default { name: 'TodoItem', // ... } ``` ## 2.组件的 data 必须是一个函数 当在组件中使用`data`属性的时候 (除了`new Vue`外的任何地方),它的值必须是返回一个对象的函数。当`data`的值是一个对象时,它会在这个组件的所有实例之间共享,如果该组件被复用将难以管理数据。 ```js // good export default { data () { return { foo: 'bar' } } } ``` ## 3.Prop 定义应该尽量详细,至少需要指定其类型 细致的 prop 定义有两个好处: - 它们写明了组件的 API,所以很容易看懂组件的用法; - 在开发环境下,如果向一个组件提供格式不正确的 prop,Vue 将会告警,以帮助你捕获潜在的错误来源。 ```js // good props: { status: String } // better props: { status: { type: String, required: true, validator: function (value) { return [ 'syncing', 'synced', 'version-conflict', 'error' ].indexOf(value) !== -1 } } } ``` ## 4.避免 v-if 和 v-for 同时用在一个元素上 当 Vue 处理指令时,`v-for`比`v-if`具有更高的优先级,所以这个模板: ```html <ul> <li v-for="user in users" v-if="user.isActive" :key="user.id" > {{ user.name }} </li> </ul> ``` 将会经过如下运算: ```js this.users.map(function (user) { if (user.isActive) { return user.name } }) ``` 因此哪怕我们只渲染出一小部分用户的元素,也得在每次重渲染的时候遍历整个列表,不论活跃用户是否发生了变化。 通过将其更换为在如下的一个计算属性上遍历: ```js computed: { activeUsers: function () { return this.users.filter(function (user) { return user.isActive }) } } ``` ```html <ul> <li v-for="user in activeUsers" :key="user.id" > {{ user.name }} </li> </ul> ``` 我们将会获得如下好处: - 过滤后的列表只会在 users 数组发生相关变化时才被重新运算,过滤更高效。 - 使用 v-for="user in activeUsers" 之后,我们在渲染的时候只遍历活跃用户,渲染更高效。 - 解耦渲染层的逻辑,可维护性 (对逻辑的更改和扩展) 更强。 ## 5.为组件样式设置作用域 当 \<style> 标签有 scoped 属性时,它通过使用 PostCSS 来实现以下转换: ```html <style scoped> .example { color: red; } </style> <template> <div class="example">hi</div> </template> ``` 转换结果: ```html <style> .example[data-v-f3f3eg9] { color: red; } </style> <template> <div class="example" data-v-f3f3eg9>hi</div> </template> ``` ## 6.组件文件 只要有能够拼接文件的构建系统,就把每个组件单独分成文件。 ```js // bad Vue.component('TodoList', { // ... }) // good components/ |- TodoList.js |- TodoItem.js ``` ## 7.组件文件的大小写 单文件组件的文件名应该要么始终是单词大写开头 (PascalCase),要么始终是横线连接 (kebab-case)。 ```js // bad components/ |- mycomponent.vue components/ |- myComponent.vue // good components/ |- MyComponent.vue components/ |- my-component.vue ``` ## 8.基础组件名 应用特定样式和约定的基础组件 (也就是展示类的、无逻辑的或无状态的组件) 应该全部以一个特定的前缀开头,比如 Base、App 或 V。 ```js // bad components/ |- MyButton.vue |- VueTable.vue |- Icon.vue // good components/ |- BaseButton.vue |- BaseTable.vue |- BaseIcon.vue components/ |- AppButton.vue |- AppTable.vue |- AppIcon.vue components/ |- VButton.vue |- VTable.vue |- VIcon.vue ``` ## 9.单例组件名 **只应该拥有单个活跃实例的组件应该以`The`前缀命名,以示其唯一性。** 这不意味着组件只可用于一个单页面,而是*每个页面* 只使用一次。这些组件永远不接受任何 prop,因为它们是为你的应用定制的,而不是它们在你的应用中的上下文。如果你发现有必要添加 prop,那就表明这实际上是一个可复用的组件,*只是目前*在每个页面里只使用一次。 ```js // bad components/ |- Heading.vue |- MySidebar.vue // good components/ |- TheHeading.vue |- TheSidebar.vue ``` ## 10.模板中的组件名大小写 **对于绝大多数项目来说,在单文件组件和字符串模板中组件名应该总是 PascalCase 的——但是在 DOM 模板中总是 kebab-case 的。** 由于 HTML 是大小写不敏感的,在 DOM 模板中必须仍使用 kebab-case。 ```html // bad <!-- 在单文件组件和字符串模板中 --> <mycomponent/> <!-- 在单文件组件和字符串模板中 --> <myComponent/> <!-- 在 DOM 模板中 --> <MyComponent></MyComponent> // good <!-- 在单文件组件和字符串模板中 --> <MyComponent/> <!-- 在 DOM 模板中 --> <my-component></my-component> ``` ## 11.多个特性的元素 **多个特性的元素应该分多行撰写,每个特性一行。** ```html // bad <img src="https://vuejs.org/images/logo.png" alt="Vue Logo"> <MyComponent foo="a" bar="b" baz="c"/> // good <img src="https://vuejs.org/images/logo.png" alt="Vue Logo" > <MyComponent foo="a" bar="b" baz="c" /> ``` ## 12.带引号的特性值 **非空 HTML 特性值应该始终带引号 (一般是双引号)** 在 HTML 中不带空格的特性值是可以没有引号的,但这鼓励了大家在特征值里 *不写* 空格,导致可读性变差。 ```html // bad <input type=text> <AppSidebar :style={width:sidebarWidth+'px'}> // good <input type="text"> <AppSidebar :style="{ width: sidebarWidth + 'px' }"> ```