前言

这里是官方的 Vue 特有代码的风格指南。如果在工程中使用 Vue,为了回避错误、小纠结和反模式,该指南是份不错的参考。

规则归类

优先级 A:必要

这些规则会帮你规避错误,所以学习并接受它们带来的全部代价吧。这里面可能存在例外,但应该非常少,且只有你同时精通 JavaScript 和 Vue 才可以这样做。

优先级 B:推荐

这些规则能够在绝大多数工程中改善可读性和开发体验。即使你违反了,代码还是能照常运行,但例外应该尽可能少且有合理的理由。

优先级 C:谨慎使用

有些 Vue 特性的存在是为了照顾极端情况或帮助老代码的平稳迁移。当被过度使用时,这些特性会让你的代码难于维护甚至变成 bug 的来源。这些规则是为了给有潜在风险的特性敲个警钟,并说明它们什么时候不应该使用以及为什么。

优先级 A 的规则:必要的 (规避错误)

组件名为多个单词 必要

组件名应该始终是多个单词的,根组件 App 以及 、 之类的 Vue 内置组件除外。这样做可以避免跟现有的以及未来的 HTML 元素相冲突,因为所有的 HTML 元素名称都是单个单词的。

反例

Vue.component('todo', {

// ...

})

export default {

name: 'Todo',

// ...

}

好例子

Vue.component('todo-item', {

// ...

})

export default {

name: 'TodoItem',

// ...

}

组件数据 必要

组件的 data 必须是一个函数。当在组件中使用 data 属性的时候 (除了 newVue 外的任何地方),它的值必须是返回一个对象的函数。

详解

data 的值是一个对象时,它会在这个组件的所有实例之间共享。想象一下,假如一个 TodoList 组件的数据是这样的:

data: {

listTitle: '',

todos: []

}

我们可能希望重用这个组件,允许用户维护多个列表 (比如分为购物、心愿单、日常事务等)。这时就会产生问题。因为每个组件的实例都引用了相同的数据对象,更改其中一个列表的标题就会改变其它每一个列表的标题。增删改一个待办事项的时候也是如此。取而代之的是,我们希望每个组件实例都管理其自己的数据。为了做到这一点,每个实例必须生成一个独立的数据对象。在 JavaScript 中,在一个函数中返回这个对象就可以了:

data: function () {

return {

listTitle: '',

todos: []

}

}

反例

Vue.component('some-comp', {

data: {

foo: 'bar'

}

})

export default {

data: {

foo: 'bar'

}

}

好例子

Vue.component('some-comp', {

data: function () {

return {

foo: 'bar'

}

}

})

// In a .vue file

export default {

data () {

return {

foo: 'bar'

}

}

}

// 在一个 Vue 的根实例上直接使用对象是可以的,

// 因为只存在一个这样的实例。

new Vue({

data: {

foo: 'bar'

}

})

Prop 定义 必要

Prop 定义应该尽量详细。在你提交的代码中,prop 的定义应该尽量详细,至少需要指定其类型。

详解

细致的 prop 定义有两个好处:

  • 它们写明了组件的 API,所以很容易看懂组件的用法;

  • 在开发环境下,如果向一个组件提供格式不正确的 prop,Vue 将会告警,以帮助你捕获潜在的错误来源。

反例

// 这样做只有开发原型系统时可以接受

props: ['status']

好例子

props: {

status: String

}

// 更好的做法!

props: {

status: {

type: String,

required: true,

validator: function (value) {

return [

'syncing',

'synced',

'version-conflict',

'error'

].indexOf(value) !== -1

}

}

}

避免 v-if 和 v-for 用在一起 必要

一般我们在两种常见的情况下会倾向于这样做:

  • 为了过滤一个列表中的项目 (比如 v-for="user in users"v-if="user.isActive")。在这种情形下,请将 users 替换为一个计算属性 (比如 activeUsers),让其返回过滤后的列表。

  • 为了避免渲染本应该被隐藏的列表 (比如 v-for="user in users"v-if="shouldShowUsers")。这种情形下,请将 v-if 移动至容器元素上 (比如 ul, ol)。

详解

当 Vue 处理指令时, v-forv-if 具有更高的优先级,所以这个模板:

v-for="user in users"

v-if="user.isActive"

:key="user.id"

>

{{ user.name }}

将会经过如下运算:

this.users.map(function (user) {

if (user.isActive) {

return user.name

}

})

因此哪怕我们只渲染出一小部分用户的元素,也得在每次重渲染的时候遍历整个列表,不论活跃用户是否发生了变化。通过将其更换为在如下的一个计算属性上遍历:

computed: {

activeUsers: function () {

return this.users.filter(function (user) {

return user.isActive

})

}

}

v-for="user in activeUsers"

:key="user.id"

>

{{ user.name }}

我们将会获得如下好处:

  • 过滤后的列表只会在 users 数组发生相关变化时才被重新运算,过滤更高效。

  • 使用 v-for="user in activeUsers" 之后,我们在渲染的时候只遍历活跃用户,渲染更高效。

  • 解藕渲染层的逻辑,可维护性 (对逻辑的更改和扩展) 更强。

为了获得同样的好处,我们也可以把:

v-for="user in users"

v-if="shouldShowUsers"

:key="user.id"

>

{{ user.name }}

更新为: v-if="shouldShowUsers">

v-for="user in users"

:key="user.id"

>

{{ user.name }}

通过将 v-if 移动到容器元素,我们不会再对列表中的每个用户检查 shouldShowUsers。取而代之的是,我们只检查它一次,且不会在 shouldShowUsers 为否的时候运算 v-for

反例

v-for="user in users"

v-if="user.isActive"

:key="user.id"

>

{{ user.name }}

v-for="user in users"

v-if="shouldShowUsers"

:key="user.id"

>

{{ user.name }}

好例子

v-for="user in activeUsers"

:key="user.id"

>

{{ user.name }}

v-if="shouldShowUsers">

v-for="user in users"

:key="user.id"

>

{{ user.name }}

优先级 B 的规则:推荐 (增强可读性)

组件文件 推荐

只要有能够拼接文件的构建系统,就把每个组件单独分成文件。当你需要编辑一个组件或查阅一个组件的用法时,可以更快速的找到它。

反例

Vue.component('TodoList', {

// ...

})

Vue.component('TodoItem', {

// ...

})

好例子

components/

|- TodoList.js

|- TodoItem.js

components/

|- TodoList.vue

|- TodoItem.vue

组件名中的单词顺序 推荐

组件名应该以高级别的 (通常是一般化描述的) 单词开头,以描述性的修饰词结尾。要注意在你的应用中所谓的“高级别”是跟语境有关的。比如对于一个带搜索表单的应用来说,它可能包含这样的组件:

components/

|- ClearSearchButton.vue

|- ExcludeFromSearchInput.vue

|- LaunchOnStartupCheckbox.vue

|- RunSearchButton.vue

|- SearchInput.vue

|- TermsCheckbox.

vue

你可能注意到了,我们很难看出来哪些组件是针对搜索的。现在我们来根据规则给组件重新命名:

components/

|- SearchButtonClear.vue

|- SearchButtonRun.vue

|- SearchInputExcludeGlob.vue

|- SearchInputQuery.vue

|- SettingsCheckboxLaunchOnStartup.vue

|- SettingsCheckboxTerms.vue

因为编辑器通常会按字母顺序组织文件,所以现在组件之间的重要关系一目了然。你可能想换成多级目录的方式,把所有的搜索组件放到“search”目录,把所有的设置组件放到“settings”目录。我们只推荐在非常大型 (如有 100+ 个组件) 的应用下才考虑这么做,因为:

  • 在多级目录间找来找去,要比在单个 components 目录下滚动查找要花费更多的精力。

  • 存在组件重名 (比如存在多个 ButtonDelete 组件) 的时候在编辑器里更难快速定位。

  • 让重构变得更难,因为为一个移动了的组件更新相关引用时,查找/替换通常并不高效。

反例

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

完整单词的组件名 推荐

组件名应该倾向于完整单词而不是缩写。编辑器中的自动补全已经让书写长命名的代价非常之低了,而其带来的明确性却是非常宝贵的。不常用的缩写尤其应该避免。

反例

components/

|- SdSettings.vue

|- UProfOpts.vue

好例子

components/

|- StudentDashboardSettings.vue

|- UserProfileOptions.vue

Prop 名大小写 推荐

在声明 prop 的时候,其命名应该始终使用 camelCase,而在模板和 JSX 中应该始终使用 kebab-case。我们单纯的遵循每个语言的约定。在 JavaScript 中更自然的是 camelCase。而在 HTML 中则是 kebab-case。

反例

props: {

'greeting-text': String

}

好例子

props: {

greetingText: String

}

多个特性的元素 推荐

多个特性的元素应该分多行撰写,每个特性一行。在 JavaScript 中,用多行分隔对象的多个属性是很常见的最佳实践,因为这样更易读。模板和 JSX 值得我们做相同的考虑。

反例

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

foo="a" bar="b" baz="c"/>

好例子

src="https://vuejs.org/images/logo.png"

alt="Vue Logo"

>

foo="a"

bar="b"

baz="c"

/>

简单的计算属性 推荐

应该把复杂计算属性分割为尽可能多的更简单的属性。

详解

更简单、命名得当的计算属性是这样的:

  • 易于测试

    当每个计算属性都包含一个非常简单且很少依赖的表达式时,撰写测试以确保其正确工作就会更加容易。

  • 易于阅读

    简化计算属性要求你为每一个值都起一个描述性的名称,即便它不可复用。这使得其他开发者 (以及未来的你) 更容易专注在他们关心的代码上并搞清楚发生了什么。

  • 更好的“拥抱变化”

    任何能够命名的值都可能用在视图上。举个例子,我们可能打算展示一个信息,告诉用户他们存了多少钱;也可能打算计算税费,但是可能会分开展现,而不是作为总价的一部分。

    小的、专注的计算属性减少了信息使用时的假设性限制,所以需求变更时也用不着那么多重构了。

反例

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

}

}

优先级 C 的规则:谨慎使用 (有潜在危险的模式)

没有在 v-ifv-else-ifv-else 中使用 key 谨慎使用

如果一组 v-if + v-else 的元素类型相同,最好使用 key (比如两个

元素)。默认情况下,Vue 会尽可能高效的更新 DOM。这意味着其在相同类型的元素之间切换时,会修补已存在的元素,而不是将旧的元素移除然后在同一位置添加一个新元素。如果本不相同的元素被识别为相同,则会出现意料之外的结果。

反例

v-if="error">

错误:{{ error }}

v-else>

{{ results }}

好例子

v-if="error"

key="search-status"

>

错误:{{ error }}

v-else

key="search-results"

>

{{ results }}

scoped 中的元素选择器 谨慎使用

元素选择器应该避免在 scoped 中出现。scoped 样式中,类选择器比元素选择器更好,因为大量使用元素选择器是很慢的。

详解

为了给样式设置作用域,Vue 会为元素添加一个独一无二的特性,例如 data-v-f3f3eg9。然后修改选择器,使得在匹配选择器的元素中,只有带这个特性才会真正生效 (比如 button[data-v-f3f3eg9])。问题在于大量的元素和特性组合的选择器 (比如 button[data-v-f3f3eg9]) 会比类和特性组合的选择器慢,所以应该尽可能选用类选择器。

反例

X

scoped>

button {

background-color: red;

}

好例子

class="btn btn-close">X

scoped>

.btn-close {

background-color: red;

}

隐性的父子组件通信 谨慎使用

应该优先通过 prop 和事件进行父子组件之间的通信,而不是 this.$parent 或改变 prop。一个理想的 Vue 应用是 prop 向下传递,事件向上传递的。遵循这一约定会让你的组件更易于理解。然而,在一些边界情况下 prop 的变更或 this.$parent 能够简化两个深度耦合的组件。问题在于,这种做法在很多简单的场景下可能会更方便。但请当心,不要为了一时方便 (少写代码) 而牺牲数据流向的简洁性 (易于理解)。

反例

Vue.component('TodoItem', {

props: {

todo: {

type: Object,

required: true

}

},

template: ''

})

Vue.component('TodoItem', {

props: {

todo: {

type: Object,

required: true

}

},

methods: {

removeTodo () {

var vm = this

vm.$parent.todos = vm.$parent.todos.filter(function (todo) {

return todo.id !== vm.todo.id

})

}

},

template: `

{{ todo.text }}

X

`

})

好例子

Vue.component('TodoItem', {

props: {

todo: {

type: Object,

required: true

}

},

template: `

:value="todo.text"

@input="$emit('input', $event.target.value)"

>

`

})

Vue.component('TodoItem', {

props: {

todo: {

type: Object,

required: true

}

},

template: `

{{ todo.text }}

X

`

})

非 Flux 的全局状态管理 谨慎使用

应该优先通过 Vuex 管理全局状态,而不是通过 this.$root 或一个全局事件总线。通过 this.$root 和/或全局事件总线管理状态在很多简单的情况下都是很方便的,但是并不适用于绝大多数的应用。Vuex 提供的不仅是一个管理状态的中心区域,还是组织、追踪和调试状态变更的好工具。

反例

// main.js

new Vue({

data: {

todos: []

},

created: function () {

this.$on('remove-todo', this.removeTodo)

},

methods: {

removeTodo: function (todo) {

var todoIdToRemove = todo.id

this.todos = this.todos.filter(function (todo) {

return todo.id !== todoIdToRemove

})

}

}

})

好例子

// store/modules/todos.js

export default {

state: {

list: []

},

mutations: {

REMOVE_TODO (state, todoId) {

state.list = state.list.filter(todo => todo.id !== todoId)

}

},

actions: {

removeTodo ({ commit, state }, todo) {

commit('REMOVE_TODO', todo.id)

}

}

}

{{ todo.text }}

@click="removeTodo(todo)">

X

import { mapActions } from 'vuex'

export default {

props: {

todo: {

type: Object,

required: true

}

},

methods: mapActions(['removeTodo'])

}

转发在看就是最大的支持❤️

vue设置isactive_Vue 编码风格指南!相关推荐

  1. JavaScript编码风格指南

    首次发表在个人博客 前言 程序语言的编码风格指南对于一个长期维护的软件而言是非常重要的;好的编程风格有助于写出质量更高.错误更少.更易于 维护的程序. 团队合作需要制定一些代码规范还有利用一些工具来强 ...

  2. Airbnb JavaScript 编码风格指南(2018年最新版)

    Airbnb JavaScript 编码风格指南(2018年最新版) 访问此原文地址:http://galaxyteam.pub/didi-fe... 另外欢迎访问我们维护的https://www.t ...

  3. c++编码风格指南_带回家的编码挑战的基本指南

    c++编码风格指南 by Jane Philipps 简·菲利普斯 带回家的编码挑战的基本指南 (The Essential Guide to Take-home Coding Challenges) ...

  4. Spring Boot 微服务编码风格指南和最佳实践

    文奇摄于世界尽头州立公园 通过多年来使用 Spring Boot 微服务,我编制了一份编码风格指南和最佳实践列表.这份清单并不全面,但我希望您能找到一两点可以借鉴的地方,无论您是新手还是经验丰富的 S ...

  5. 来自 Google 的 R 语言编码风格指南

    来自 Google 的 R 语言编码风格指南 R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...

  6. c++编码风格指南_100%正确的编码样式指南

    c++编码风格指南 Here are three links worth your time: 这是三个值得您花费时间的链接: The 100% correct coding style guide ...

  7. c++编码风格指南_100%正确编码样式指南

    c++编码风格指南 Tabs or spaces? Curly brace on the same line or a new line? 80 character width or 120? 制表符 ...

  8. Python 编码风格指南

    本节收录了稍作剪辑的PEP 8摘要(Python Enhancement Proposal,Python增强提案).PEP 8由Guido van Rossum和Barry Warsaw撰写,是Pyt ...

  9. Python编码风格指南

    来源 | 异步图书 本节收录了稍作剪辑的PEP 8摘要(Python Enhancement Proposal,Python增强提案).PEP 8由Guido van Rossum和Barry War ...

  10. 【翻译】Ext JS——高效的编码风格指南

    原文:ExtJS - Efficient coding style guide 作者:Raja 切勿使用"new"关键字:在Ext JS中,使用"new"关键字 ...

最新文章

  1. 面试官问:平时碰到系统CPU飙高和频繁GC,你会怎么排查?
  2. 论文整理集合 -- 吴恩达老师深度学习课程
  3. 最近开发老遇到莫名其妙的问题,dialog自定义大小,setAttributes这个方法没反应是肿么一回事...
  4. 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套
  5. Docker报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. ...
  6. office控件显示不了_计算机二级office考试重点难点总结,考生必看!
  7. MySQL查询时构建自增ID
  8. mybitis实现增,删,改,查,模糊查询的两种方式:(2)
  9. 使用Servlet和Bootstrap上传Ajax文件
  10. Linux中exit与_exit的区别
  11. Android官方开发文档Training系列课程中文版:OpenGL绘图之添加动态效果
  12. 2020年对我影响最深的观点是下面3个,你呢?
  13. Java ArrayList 数组之间相互转换
  14. 计算机win7截长屏,怎么用截图工具截比电脑屏幕长的图片?-WIN7截长图,win7怎么滚动截长图...
  15. 第十届南京邮电大学网络攻防大赛(NCTF 2021)writeup
  16. Unity webGl 鼠标手指触屏控制相机围绕物体 360度旋转
  17. 中国科学院大学计算机学院夏令营,中科院计算所2019年夏令营名单
  18. 用纯CSS3的animation制作雪花飘落、星星闪烁、按钮缩放、图片倾斜
  19. UVALive 6922 Reverse Polish Notation
  20. php session fixation,Session Fixation 原理与防御

热门文章

  1. ICML2018论文公布!一文了解机器学习最新热议论文和研究热点
  2. 使用PowerShell 导出Exchange中的用户中用户信息到Office 365
  3. 洛谷 P1129 BZOJ 1059 cogs 660 [ZJOI2007]矩阵游戏
  4. adb uninstall
  5. js中,还真不了解 console
  6. esxi update patch
  7. 计算机视觉和机器学习,代码,论文大全
  8. 【SpringBoot_ANNOTATIONS】组件注册 02 @ComponentScan 自动扫描组件 指定扫描规则
  9. 阿里巴巴Java开发文档2020版学习-命名风格
  10. java if else重构_Java编程细节-重构-为什么 if-else 不是好代码