导航


HTML

CSS

JavaScript

浏览器 & 网络

版本管理

框架

构建工具

TypeScript

性能优化

算法

UI、组件库

Node

业务技能

针对性攻坚

AI

公共类


基础代码规范

一个良好的命名规范能够在绝大多数中改善可读性和开发体验

命名规范

组件命名

# 正常/业务组件命名
person.vue
personDetail.vue
user.vue
userDetail.vue

# 公共组件
HAView.vue
HALayout.vue
// bad
<HaView title="title" />
// good
<ha-view title="title" />

Props 命名

方法命名

自定义事件命名

指令命名

变量命名

常量命名

其他

文件编写顺序

Template-Script-Style 顺序

<!-- 推荐结构 -->
<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  data() {
    return {
      message: 'Hello'
    }
  } // Vue 2

  setup() {
    const message = ref('Hello');
    return {
      message
    }
  } // Vue 3
}
</script>
<style scoped>
div {
  color: red;
}
</style>

文件内容应按一定顺序,原则是先外后内,先组件、数据后函数,先生命周期函数后自定义函数

- components
- props
- data
- watch
- computed
- created
- mounted
- activited
- update
- beforeRouteUpdate
- methods

指令规范

指令有缩写一律采用缩写形式

// bad
v-bind:class="{'show-left':true}"
v-on:click="getListData"

// good
:class="{'show-left':true}"
@click="getListData"

v-for 循环必须加上 key 属性,在整个 for 循环中 key 需要唯一

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

  <!-- bad -->
  <ul>
    <li v-for="todo in todos">
      {{ todo.text }}
    </li>
  </ul>

避免 v-if 和 v-for 同时用在一个元素上(性能问题)

以下为两种解决方案

<!-- bad -->
<ul>
    <li v-for="user in users" v-if="user.isActive" :key="user.id">
      {{ user.name }}
    </li>
</ul>

<!-- good -->
<ul>
    <li v-for="user in activeUsers" :key="user.id">
      {{ user.name }}
    </li>
</ul>

<script>
computed: {
    activeUsers: function () {
      return this.users.filter(function (user) {
        return user.isActive
      })
    }
}
</script>
<!-- bad -->
<ul>
  <li v-for="user in users" v-if="shouldShowUsers" :key="user.id">
    {{ user.name }}
  </li>
</ul>

<!-- good -->
<ul v-if="shouldShowUsers">
  <li v-for="user in users" :key="user.id">
    {{ user.name }}
  </li>
</ul>

Props 规范

Props 定义应该尽量详细

// bad
props: ['status']

// good
props: {
  status: {
    type: String,
    required: true,
    validator: function (value) {
      return [
        'syncing',
        'synced',
        'version-conflict',
        'error'
      ].indexOf(value) !== -1
    }
  }
}

其他