vue项目规范

技术栈

  • vue2
  • vuex
  • vue-router
  • webpack
  • ES6/7
  • axios
  • less/sass
  • vue-i18n
  • 等...

src目录布局

├── src
│   ├── assets
│   │   ├── image                               // 公共图片
│   │   ├── style                               // 公共样式
│   ├── components                              // 存放公共组件
│   │   ├── button                              // 公共按钮组件
│   │   ├── footer                              // 公共底部组件
│   │   └── header                              // 公共头部组件
│   ├── config                                  // 存放基本配置
│   ├── page                                    // 存放业务组件,内部按模块进行区分,如下:
│   │   ├── shop                                // 商店组件
│   │   │   ├── children                        // 只在该模块用到的一些公共组件
│   │   │   │   ├── foodDetail.vue 
│   │   │   │   └── shopDetail.vue 
│   │   │   └── shop.vue                        // 该模块入口文件
│   ├── plugins                                 // 存放引用的插件
│   ├── router
│   │   └── router.js                           // 路由配置
│   ├── service                                 // api接口统一管理
│   ├── store                                   // vuex的状态管理
│   │   ├── action                              // 配置actions
│   │   ├── getters                             // 配置getters
│   │   ├── index.js                            // 引用vuex,创建store
│   │   ├── mutationTypes                       // 定义常量muations名
│   │   └── mutations                           // 配置mutations
│   ├── App.vue                                 // 页面入口文件
│   ├── main.js                                 // 程序入口文件,加载各种公共组件

组件

1. 组件元素顺序保持一致,<template>、<script>、 <style>,内部样式必须加scoped
<template>
  <div>
    <!-- ... -->
  </div>
</template>
<script>
  export default {
    components : {},
    data () {
      return {}
    },
    methods: {},
    mounted() {}
 }
</script>
<!--声明语言,并且添加scoped-->
<style lang="less" scoped>
</style>
2. vue文件方法声明顺序
- components   
- props    
- data     
- computed
- created
- mounted
- activited
- update
- beforeRouteUpdate
- metods   
- filter
- watch
3. props规范
  1. 传值尽量简化,每一个属性单独使用一个 props,避免复杂的对象。使组件的API更加直观
  2. 验证组件的 props,保证组件的 props 能应对不同的情况,即使其他开发者并未按照你预想的方法使用时也不会出错。
  • prop 的定义应该尽量详细,至少需要指定其类型。
    data () {
      return {
        height:{
            type: Number, 
            default: 0,
            required: true,
            validator: function (value) {
                return value >= 0
            }
        },
      }
    },
    
  • 使用 props 之前先检查该 prop 是否存在
4.公共组件必须保证是独立的, 可复用的,拒绝定制代码。要写组件使用说明。
<!--
  /**
  * 组件名称
  * @desc 组件描述
  * @author 组件作者
  * @param {Number} [age]    - 参数说明
  * @param {String} [name] - 参数说明
  * @example 调用示例
  *  <person :age="age" :columns="columns" :name="name"></person>
  */
   -->
   
   //使用的时候,属性比较多的话分行写
   <inputFiled 
        type="number" 
        :placeholder="$t('login.please_inout_usual_phone_number')" 
        iconClass="icon-ico_shoujihao"
        max="11" 
    />
    
5. 组件的每一个方法都要写注释
  • 普通方法使用单行注释
     // 说明该方法主要作用
    
  • 复杂方法使用多行注释
     /**
      * @desc 说明该方法主要作用
      * @param {Number} [age]    - 参数说明
      * @param {String} [name] - 参数说明
      */
    
6. 不要在 mounted、created 之类的方法写逻辑。
7. 尽量使用Vue的指令缩写 (用 : 表示 v-bind: 和用 @ 表示 v-on:)
8. css尽量使用类选择器,元素选择器比较慢
9. 使用Vuex 管理全局状态
10. 子组件内不要使用this.$parent直接访问父组件的上下文。访问组件之外的上下文违反了基于模块开发的第一原则。组件必须相互保持独立。
1、通过 props 将值传递给子组件
2、通过 props 传递回调函数给子组件来达到调用父组件方法的目的
3、通过在子组件触发事件来通知父组件
11. 尽量避免使用 this.$refs来访问其它组件的上下文。
12. 组件内不要使用复杂的行内表达式,可以使用 method 或是 computed 属性来替代其功能。复杂的行内表达式难以阅读,也不能复用。
13. v-if 和 v-for,v-for的优先级高于v-if。
  • 两种常见的情况:

    1、为了过滤一个列表中的项目 (比如v-for="item in dataList" v-if="item.isComplete")。
    如果dataList是一个较为庞大的数组,请将 dataList 替换为一个计算属性 (比如 completeList),让其返回过滤后的列表。

    2、隐藏整个列表,(比如v-for="item in dataList" v-if="shouldShowList")。
    这种情形下,请将 v-if 移动至容器元素上。

router-路由

1. 使用懒加载
const Home = () => import('./Home.vue')

const router = new VueRouter({
  routes: [
    { 
        path: '/home', 
        name: 'home', 
        component: Home
    }
  ]
})

2. 路由都添加 name 字段,路由跳转统一使用 name 进行跳转,方便管理
  • 组件跳转
    <router-link :to="{ name: 'home' }">Home</router-link>
    
  • 方法跳转
    this.$router.push({ name: 'home' })
    

vuex

1. 两种模式,一种按业务模块划分,一种按store的属性划分
  • 按业务模块划分(业务逻辑比较复杂)

    const modelA = {
        state: {...},
        mutations: {...},
        actions: {...},
        getters: {...},
    }
    const modelB = {
        state: {...},
        mutations: {...},
        actions: {...},
        getters: {...},
    }
    
  • 按store的属性划分(业务逻辑比较简单)

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

推荐阅读更多精彩内容

  • vue笔记 一.vue实例 vue的生命周期 beforeCreate(创建前), created(创建后), b...
    秋殇1002阅读 1,044评论 0 1
  • 目录 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element★13489 ...
    余生社会阅读 19,649评论 7 233
  • 目录 一、项目结构的核心思想 二、项目目录结构 三、资源路径编译规则 四、index.html 五、build目录...
    科研者阅读 11,321评论 0 40
  • 2018.07.27日周五 玉洁坚持分享第98天! 忙完了一天的工作,临睡前读一两篇该读的书,我很享受这一美好时...
    快乐舒馨阅读 147评论 0 0
  • #萌主日记Day27# 没有记录就没有发生 【昨日成就】 1. 整理家务(在家劳动了一整天,累并快乐着,其实,我真...
    廖如意阅读 238评论 0 1