Vue 代码书写风格指南

查看 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官网

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容