vue开发规范

前言

好的命名规范可以让不用为取名字而苦恼,同时找bug时更快的定位到位置。

  • 与它的功能相配套
  • 不与其他业务组件命名冲突,容易区分
  • 不一定好听酷炫,但实用,开发者根据命名就会知道组件的实用场景
  • 易写易记、短小却精炼、不繁琐

BEM

  • .nav某一块展示/功能区域 (div)
  • .nav__item这块展示/功能区域(div)里面的某个元素,比如: nav__item
  • .nav__item--hide/ .nav__item--open 某个元素或者某个块的状态

注:不要使用敏感词汇。例如:给元素绑定class为advertisement样式,浏览器开启去广告模式后,可能直接把这个div给删掉。

函数与属性命名规则

  1. 把函数未执行归咎于代码逻辑问题
  2. 使用正常的时态,特别是代码中状态的变量或者函数的命名。
比如 onXxxxStarted 表示xxx已经启动了,isConnecting表示正在连接。
正确的时态可以给使用者传递准确的信息。 

函数与属性的命名区别

  1. 函数,建议使用动宾结构,动宾结构就是 doSomething,这样的函数命名含义明确。
    比如:openFile, setName, addNumber...
  2. 属性,建议使用定语+名词。
    比如: fileName, maxLength, textSize
  3. 不要单词+拼音混合使用
    比如:useJiFen,huKouNumber.. 缺乏美感不说,可读性大幅度降低。
  4. 谨慎使用缩写
    除非是约定俗成已经被广泛使用的缩写,否则老老实实用完整拼写。
    典型的反面例子: count->cnt, manager->mgr password->pwd button->btn。
    无论我们使用eclipse 或者intellij, 都有很好的自动完成功能,名字长一点没关系的,可读性更重要。
  5. 命名的语义话(动词、名词的区分)

变量命名规则

变量使用主要集中在 data 和 methods 中,其中 data 中更多的是名词、状态布尔两种类型。

  1. 名词太多,大致分为复数、后缀加Arr、加Obj之类作为约定规则
  2. 状态布尔型可以使用is表示是不是,has表示有没有,can表示能不能
  3. 单词本身的形式(过去式、进行时、将来时):had开头、ing、ed结尾等
  • 表示是不是,用is + ... :如 isEmpty
  • 表示有没有,用 has + ... : 如 hasClass
  • 表示能不能,用 can + ... :如 canSubmit

Methods 中 handle + 以下

添加(add)、移除(emove)、删除(delete)、插入(insert)、开始\停止(start|begin\stop)、结束(end)、发送(send)、接受(receive),取出(get)、设置(set)、释放(release)、向上\向下(up\down)、显示\隐藏(show\hide)、打开\关闭(open\close)、增加(increment)、减少(decrement)、锁\解锁(lock\unlock)、下一个\前一个(next\previous)、创建\销毁(create\destory)、最小\最大(min\max)、可见\不可见(visible\invisible)、出栈\入栈(pop\push)、储存(store)、查询(query)

结合业务:
表单操作提交:submit\add\delete\update\search\reset\check
上传附件:upload
关闭\打开弹窗:openWin/closeWin

组件命名规范

Ant.design 的 React 组件是下面这样的时候,我感觉到一种自由的味道。首先,组件名可以使用原生 HTML 标签名,意味着再也不用较劲脑汁去规避原生 HTML 标签了。另外,这些组件都使用了首字母大写标签名,使它们很容易地与原生小写的 HTML 标签区分。


组件文件名应该始终以单词大写开头,组件名也是以单词大写开头,当多个单词拼写成的组件时,单词开头大写,采用驼峰式命名规则一般是多个单词全拼,减少简写的情况,这样增加可读性。

组件应该都放到components文件夹下,单个页面独立一个文件夹,用来放相对应的vue文件以及页面相关的样式文件,样式少可直接写到页面组件里边,这样更符合组件化的思想。

公用组件应该统一放到public文件下。

例如:

  1. 公共的样式文件应该提取出来放在统一的文件中来统一管理
  2. 项目级组件一般放到公共文件夹public下供业务组件使用

基础组件

应用特定样式和约定的基础组件 (也就是展示类的、无逻辑的或无状态的组件) 应该全部以一个特定的前缀开头,比如 Base、App 或 V。

**反例**
    components/
    |- button.vue
    |- loading.vue
    |- slide.vue
**正例**
    components/
    |- BaseButton.vue
    |- BaseLoading.vue
    |- BaseSlide.vue

单个活跃组件

单个活跃实例的组件应该以 The 前缀命名,以示其唯一性。这不意味着组件只可用于一个单页面,而是每个页面只使用一次。
这些组件永远不接受任何 prop,因为它们是为你的应用定制的,而不是它们在你的应用中的上下文。如果你发现有必要添加 prop,那就表明这实际上是一个可复用的组件,只是目前在每个页面里只使用一次。

**反例**
    components/
    |- SaleManage.vue
    |- ImportExcel.vue
**正例**
    components/
    |- TheSaleManage.vue
    |- TheImportExcel.vue

紧密耦合组件

与父组件紧密耦合的子组件应该以父组件的命名为前缀.如果一个组件只在其父组件某个场景下有意义,这层关系应该体现在组件名上,因为编辑器通常按照首字母顺序组织文件.

**反例**
    components/
    |- SearchBox.vue
    |- SearchItem.vue
    |- SearchButton.vue
**正例**
    components/
    |- SearchBox.vue
    |- SearchBoxItem.vue
    |- SearchBoxButton.vue

组件名中的单词顺序

组件名应该以高级别的单词开头,以描述性的修饰词结尾。

**反例**
    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/
    |- soManage.vue
    |- woManage.vue
**正例**
    components/
    |- SaleOrderManage.vue
    |- WorkOrderManage.vue

PROP定义与书写

书写格式

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

**反例**
props: {
    'greeting-text': String
}
<WelcomeMessage greetingText="hi"/>

**正例**
props: {
    greetingText: String
}
<WelcomeMessage greeting-text="hi"/>

定义规则

当定义组件时,应该对传入组件的props进行严格的定义,至少指定类型,同时设定默认值。这样可以好处是方便他人使用。

props:{
    modelflag:{
        type:Number,
        default:0
    }
}

组件结构

组件结构一个遵循从上往下是template,script,style的结构

<template>
    <div></div>
</template>

<script>
</script>

<style>
</style>

组件样式

单个组件样式一般可直接写到组件下style标签下,为了防止样式污染,可添加scoped 属性,
也可以通过设置作用域来防止样式污染,写样式的时候尽量少写元素选择器,为了提高代码查找速度,可以用类选择器。

<template>
    <div class="homePage">
        <div class="list"></div>
        <div class="banner"></div>
    </div>
</template>

<script>
</script>

<style lang="scss" scoped>
 .homePage{
     .list{
     }
     .banner{
     }
 }
</style>

多属性格式编写

当组件定义很多的props值时,应该每个特性属性一行。

<SelectExportItem
    v-bind="$attrs"
    :selectItemList="selectItemList"
    @hideSelectItem="$emit('hideSelectItem')"
    @exportReport="exportReport">
</SelectExportItem>

v-for指令增加 key

为 v-for指令增加 key 值,这样提高查找速度。

<ul>
    <li
        v-for="todo in todos"
        :key="todo.id">
        {{ todo.text }}
    </li>
</ul>

全局变量推荐使用 Vuex状态管理

当页面用到一些共享的状态的时,建议使用vuex

Axios统一处理接口

使用Axios进行接口请求,然后对项目中的接口做统一拦截处理,封装适合项目使用的 get\post 方法。

import Vue from 'vue'
import axios from 'axios'
import { encode, decode,toEncode,toDecode} from './base64.js'
import Qs from 'qs';
import router from './router'

let timeout = 30000;

let instance = axios.create({
     //baseURL: 'https://vuedomain.com/api/',
     timeout: timeout,
     responseType: 'json', // default,
     //headers: {'apikey': 'foobar'},
     transformRequest: function(data, headers) {
         // 为了避免qs格式化时对内层对象的格式化先把内层的对象转为
         // 由于使用的form-data传数据所以要格式化
         if(!(data instanceof FormData)) {
         if (typeof data === "string") {
            headers.post['Content-Type'] = "application/json";
         } else {
             headers.post['Content-Type'] = "application/x-www-form-urlencoded";
             for(let key in data) {
                if(data[key] === undefined) {
                    data[key] = null;
                }
             }
             data = Qs.stringify(data);
             }
         }
         return data;
     }
    });
    instance.interceptors.request.use(function(config) {
     // Do something before request is sent 
     //header 添加Request-Token
     //配置请求头tocken   
     //配置get请求   
     return config;
    }, function(error) {
        // Do something with request error 
        return Promise.reject(error);
    })
    // Add a response interceptor 
    instance.interceptors.response.use(function(response) {
        // Do something with response data 
     
        if (response.data.status===400001) { //access tocken过期30天
            vm.$router.push({path:'/login'})
        }
        return response;
    }, function(error) {
     // Do something with response error  
    return Promise.reject(error);
});
export default instance;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容