Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • JavaScript

  • TypeScript

  • Vue

    • Vue 编码指南
      • Vue 规范
        • Vue 官方文档: 风格指南 — Vue.js
        • Vue.js 组件编码规范: 中文 - docs
        • 项目 src 目录结构
        • Vue 文件
      • 关于代码评审(Code Review)
    • vue-cli 启动本地服务局域网不能访问的原因分析
    • 解决 Vue 相同路由参数不同不会刷新的问题
    • 解决 vuex requires a Promise polyfill in this browser 问题
    • 关于父组件通过 v-on 接收子组件多个参数的一点研究
    • Vue $attrs 和 $listeners
    • Vue axios 发送 Form Data 数据格式请求
    • Vue 开发技巧
    • Vue 动态路由
    • Vue 集成 UEditor 富文本编辑器
    • Vue 修饰符
    • Vue 问题集合
    • Vue props 传多值的问题
    • vue-router 在 IE11 下手动更改 URL 的 hash 不会触发路由
    • vue-router 路由参数刷新消失的问题
    • 那些年被我们忽略的 vue 语法
    • vue 生命周期深入
    • vue 组件通信深入
    • vue 组件通信深入 Vuex
    • vue项目移动端、pc端适配方案
    • vuepress 如何引入 vuex
  • ElementUI

  • React

  • AntD

  • 前端
  • Vue
Henry
2019-09-06
目录

Vue 编码指南

# Vue 规范

# Vue 官方文档: 风格指南 — Vue.js (opens new window)

# Vue.js 组件编码规范: 中文 - docs (opens new window)

团队风格以官方为主

# 项目 src 目录结构

📦src
 ┣ 📂api 接口
 ┃ ┣ 📜index.js
 ┣ 📂assets 静态资源
 ┃ ┣ 📂iconfont
 ┃ ┃ ┣ 📜iconfont.css
 ┃ ┗ 📂images
 ┃ ┃ ┣ 📜index.jpg
 ┣ 📂components 组件, 一般放置公共组件和每个页面里的子组件
 ┃ ┣ 📂Home Home 页面的子组件
 ┃ ┃ ┣ 📜index.vue 只有一个子组件, 组件名为 index
 ┃ ┣ 📂Projects Projects 页面的子组件
 ┃ ┃ ┣ 📜ProjectsList.vue 多个子组件, 组件名以父组件名开头
 ┃ ┃ ┣ 📜ProjectsSearch.vue
 ┃ ┣ 📂Plugins 公共组件
 ┃ ┃ ┣ index.vue
 ┃ ┃ ┗ index.js
 ┃ ┗ index.vue
 ┣ 📂router 路由
 ┃ ┣ 📜index.js
 ┣ 📂store
 ┃ ┣ 📜actions.js
 ┃ ┣ 📜index.js
 ┃ ┣ 📜mutation-types.js
 ┃ ┗ 📜mutations.js
 ┣ 📂styles 样式
 ┃ ┣ 📜index.less
 ┃ ┣ 📜reset.less
 ┣ 📂utils 工具方法
 ┃ ┣ 📜index.js
 ┣ 📂views 页面
 ┃ ┣ 📂Projects
 ┃ ┃ ┣ 📜index.vue
 ┃ ┣ 📜Home.vue Home 页面
 ┃ ┣ 📜Index.vue 主页面
 ┣ 📜App.vue
 ┗ 📜main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

注:

  1. 由于 Vue 官方规定单文件组件的文件名以单词大写开头 (PascalCase), 为了统一, 故团队规定组件的文件夹名称也以单词大写开头
  2. 当一个文件夹下只有一个 js 或 vue 文件, 该文件名称为 index, 方便引入. 具体参考 Vue 中 import from 的来源:省略后缀与加载文件夹 (opens new window). 要注意 .js 的优先级 大于 .vue

# Vue 文件

以 ProjectsList.vue 组件为例:

<template>
  <!-- class 为组件名的 kebab 形式, 即以中划线分割的单词组 -->
  <div class="projects-list">
    <scroller>
      <group>
        <cell>
          <!-- 组件名统一使用 kebab 形式 -->
          <number-input></number-input>
        </cell>
      </group>
    </scroller>
  </div>
</template>
1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
// 首先引入 'vuex'
import { mapState, mapGetters, mapActions } from 'vuex'
// 先引入自己的组件, 根据组件出现在页面的位置从上到下依次引入
import Scroller from '@components/Scroller'
import NumberInput from '@components/NumberInput'
// 再引入 UI 组件
import { Group, Cell } from 'vux'
// 引入 mixins
import mixins from '@components/mixins'
// 组件的选项统一使用以下顺序
export default {
  // 为防止 name 重复, 统一设置为组件名
  name: 'ProjectsList',
  // 组件注册顺序和引入顺序保持统一
  components: {
    Scroller,
    NumberInput,
    Group,
    Cell
  },
  mixins: [mixins],
  // props 最好包含类型检查和默认值; 默认值如果为对象, 必须使用 return 返回
  props: {
    list: {
      type: Array,
      default() {
        return []
      }
    }
  },
  // data 定义变量的顺序根据出现在页面的位置从上到下依次定义
  data() {
    return {
      projectsList: []
    }
  },
  // computed 优先计算 'vuex'
  computed: {
    ...mapState(['projectId']),
    ...mapGetters(['isOffline']),
    disabled() {
      return !projectsList.length
    }
  },
  watch: {
    list() {
      this.init()
    }
  },
  methods: {
    // 方法中最好有一个 init, 来执行页面初始化的所有函数
    init() {
      this.fetchProjectList()
    },
    // 方法顺序也是根据出现在页面的位置从上到下依次写入
    // 如果页面是 增删改查, 按照: 查--增--改--删 的顺序写入
    fetchProjectList() {},
    addProject(){},
    editProject(){},
    deleteProject(){},
    // format 类型的函数最后写入
    formatProject(){},
  },
  created() {},
  mounted() {
    this.init()
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<style lang="less">
/*
  * css 不推荐通过添加 scope 来防止样式冲突(使用 scope 会导致无法覆盖某些 ui 组件库样式)
  * 而使用一个大类包裹当前页面所有样式来防止样式冲突
  * 当然必须保证这个大类在该项目中的唯一性
  * 最保险的办法就是同时使用特定前缀和组件名
  * 比如 page-projects-list, page 这个前缀只有组件的大类才可以使用
  */
.projects-list {
  width: 100%;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12

可以配合 VS Code 使用代码模版生成统一的 vue 文件, 具体配置请看 传送门

# 关于代码评审(Code Review) (opens new window)

  • Vue技术团队都在推广的代码规范 (opens new window)
编辑 (opens new window)
#Vue#Guidelines
上次更新: 5/27/2023, 1:02:05 PM
TS 编译选项
vue-cli 启动本地服务局域网不能访问的原因分析

← TS 编译选项 vue-cli 启动本地服务局域网不能访问的原因分析→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式