【前端开发必备小技巧】前端代码规范Vue篇

news2024/11/15 18:15:28

文章目录

  • 🟢 前端代码规范
  • 🟢 一、前端代码规范Vue篇
    • 👉1、Vue编码基础
        • 👉1.1、组件规范
        • 👉1.2、模板中使用简单的表达式
        • 👉1.3、指令都使用缩写形式
        • 👉1.4、 标签顺序保持一致
        • 👉1.5、必须为 v-for 设置键值 key
        • 👉1.6、v-show 与 v-if 选择
        • 👉1.7、script 标签内部结构顺序
        • 👉1.8、Vue Router 规范
    • 👉2、Vue 项目目录规范
        • 👉2.1、基础
        • 👉2.2、使用 Vue-cli 脚手架
        • 👉2.3、 目录说明
        • 👉2.4、注释说明
        • 👉2.5、其他
  • ✒️总结


🟢 前端代码规范

规范的目的是为了编写高质量的代码,让你的团队成员每天得心情都是愉悦的,大家在一起是快乐的。
引自《阿里规约》的开头片段:
…现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有红绿灯,谁还敢上路行驶。对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。

🟢 一、前端代码规范Vue篇

在这里插入图片描述

👉1、Vue编码基础

Vue 项目规范以 Vue 官方规范https://v2.cn.vuejs.org/v2/style-guide/中的A规范为基础,在其上面进行项目开发,故所有代码均遵守该规范。

请仔仔细细阅读 Vue官方规范,切记,此为第一步。

👉1.1、组件规范
  1. 组件名为多个单词
    组件名应该始终是多个单词组成(大于等于 2),且命名规范为KebabCase格式。
    这样做可以避免跟现有的以及未来的 HTML 元素相冲突,因为所有的 HTML 元素名称都是单个单词的。

正例:

export default {
  name: 'TodoItem',
  // ...
}

反例:

export default {
  name: 'Todo',
  // ...
}
export default {
  name: 'todo-item',
  // ...
}
  1. 组件文件名为 pascal-case 格式

正例:

components/
|- my-component.vue

反例:

components/
|- myCoaponent.vue
|- MyCoaponent.vue
  1. 基础组件文件名为 base 开头,使用完整单词而不是缩写

正例:

components/
|-base-button.vue
|-base-table.vue
|-base-icon.vue

反例:

components/
|- MySutton.vue
|- VueTable.vue
|- Icon.vue
  1. 和父组件紧密属合的子组件应该以父组件名作为前缀命名

正例:

components/
|- todo-list.vue
|- todo-list-item.vue
|- todo-list-item-button.vue
|- user-profi1e-options.vue(完整单词)

反例:

components/
|- TodoList.vue
|- TodoItem. vue
|- TodoButton.vue
|- UProfopts.vue(使用了缩写)
  1. 在Template 模版中使用组件,应使用 PascalCase 模式,并且使用自闭合组件。

正例:

<1--在单文件组件、字符串模板和JSX中-->
<myComponent />
<Rom><table :colum="data"/></Rom>

反例:

<my-component /><row><table :column="data"/></row>
  1. 组件的 data 必须是一个函致
    当在组件中使用 data 属性的时候 (除了 new Vue 外的任何地方),它的值必须是返回一个对象的函数。 因为如果直按是一个对象的话,子组件之间的属性值会互相影响,

正例:

export default {
  name: 'App',
  data(){
    return{
      title:'我是一个标题',
    }
  },
}

反例:

export default {
  name: 'App',
  data:{
    title:'我是一个标题',
  },
}
  1. Prop 定义应该尽量详细
    • 必须使用 camelCase 驼峰命名
    • 必须指定类型
    • 必须加上注释,表明其含义
    • 必须加上 required 或者 default,两者二选其一
    • 如果有业务需要,必须加上 validator 验证

正例:

export default {
  name: "HelloWorld",
  props: {
    //组件状态,用于控制组件的颜色
    status: {
      type: String,
      required: true,
      validator: function (value) {
        return ["succ", "info", "error"].indexof(value) !== -1;
      },
    },
    // 用户级别,用于显示皇冠个效
    userLevel: {
      type: String,
      required: true,
    },
  },
};
  1. 为组件样式设置作用域

正例:

<template>
  <div class="hello">
      HelloWorld
  </div>
</template>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.hello {
  color: white;
  font-size: 22px;
  margin: 10px 0 0;
}
</style>

反例:

<template>
  <div class="hello">
      HelloWorld
  </div>
</template>
<!-- 没有scoped 特性-->
<style >
.hello {
  color: white;
  font-size: 22px;
  margin: 10px 0 0;
}
</style>
  1. 如果特性元素较多,应该主动换行

正例:

      <MyComponent 
        foo="a" 
        bar="b" 
        baz="c">
      </MyComponent>

反例:

     <MyComponent foo="a" bar="b" baz="c"></MyComponent>
👉1.2、模板中使用简单的表达式

组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模极变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。
正例:

<template>
  <div >
    {{ normalizedFullName }}
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  computed:{
    normalizedFullName:function(){
      return this.fullName.split(' ').map((word)=>{
        return word[0].toUpperCase()+word.split(1)
      }).join(' ')
    }
  }
};
</script>

反例:

<template>
  <div >
    {{ fullName.split(' ').map((word)=>{
        return word[0].toUpperCase()+word.split(1)
      }).join(' ')}}
  </div>
</template>
👉1.3、指令都使用缩写形式

指令推荐都使用缩写形式,(用 : 表示v·bind: ,用 @ 表示 v-on, 用#表示 v-slot:)
正例:

   <input
   @input="onInput"
   @focus="onFocus">

反例:

   <input
  v-on:input="onInput"
   @focus="onFocus">
👉1.4、 标签顺序保持一致

单文件组件应该总是让标签顺序保持为
正例:

<template>

</template>

<script>

</script>

<style scoped>

</style>

反例:

<template>

</template>

<style scoped>

</style>

<script>

</script>


👉1.5、必须为 v-for 设置键值 key
👉1.6、v-show 与 v-if 选择

如果运行时,需要非常颜繁地切换,使用v·show;如果在运行时,条件很少改变,使用v-if。

👉1.7、script 标签内部结构顺序

components>props>data>compued>watch>filter>钩子函数(钩子函数按其执行顺序)>methods

👉1.8、Vue Router 规范
  1. 页面跳转数据传递使用路由参数
    页面跳转,例如A页面跳转到B页面,需要将A页面的数据传递到B页面,推使用路由参数进行传参,而不是将需要传递的数据保存 vuex,然后在 B页面取出 vuex的数据,因为如果在 B页面刚新会导致 vuex 数据丢失
    正例:
let id='1113'
this.$router.push({name:'userDetail',
	query:{
 	 id:id
	}
})
  1. 使用路由懒加载(延迟加载)机制
{
    path: "/Login",
    name: "Login",
    // 登录页
    component: () => import('@/components/Login/Login.vue'),
}, 

3.router 中的命名规范
path、childrenPoints命名规范采用kebab-case命名规范(尽量vue文件的目录结构保持一致,因为目录、文件名都是kebab-case,这样很方便找到对应的文件)

 {
        path:'/system/system-list',
        // 系统列表
        name:'SystemList',
        component:()=>import('../components/system/system-list.vue')
    }

4.router 中的 path 命名规范
path除了采用kebab-case命名规范以外,必须以/开头,即使是children里的path也要以/开头。如下示例
目的:
经常有这样的场景:某个页面有问题,要立刻找到这个文件,如果不用以/开头,path为parent和children组成的,可能经常需要在router文件里搜索多次才能找到,而如用以/开头,则能立刻搜索到对应的组件

{
    path: '/',
    // 首页
    name: 'home',
    component: () => import('../components/home/home.vue'),
    redirect: '/panel',
    // 重定向到看板页
    children:[
        {
            path:'/panel',
            // 大屏面板
            name:'Panel',
            component:()=>import('../components/panel/panel.vue'),
            meta: {
                bg: 'bg'
            },
            // 背景图
        },
        {
        path:'/system',
        // 系统设置
        name:'System',
        component:()=>import('../components/system/system.vue')
    }]
}

👉2、Vue 项目目录规范

👉2.1、基础

vue 项目中的所有命名一定要与后端命名统一。
比如权限:后端 privilege,前端无论 router,store,api等都必须使用 privielege 单词!

👉2.2、使用 Vue-cli 脚手架

使用 vue·cli3 来初始化项目,项目名按照上面的命名规范

👉2.3、 目录说明

目录名按照上面的命名规范,其中components 组件用大写驼峰,其余除components 组件目录外的所有目录均便用 kebab-case 合名。

src源码目录

 |-- api 				所有api接口
 |-- assets 			静志资源,images,icons,styles等
 |-- components			公用组件
 |-- config				配置信息
 |-- constants			常量信息,项目所有Enun,全局常量等
 |-- directives			自定义指令
 |-- filters			过滤器,全局工具
 |-- datas				模拟教据,临时存放
 |-- lib				外部引用的插件存放及修改文件
 |-- mock				模拟接口,临时存放
 |-- plugins			插件,全局使用
 |-- router				路由,统一管理
 |-- store				vuex,统一管理
 |-- themes				自定义样式主题
 |-- views				视图目录
 |  |-- role				role模块名
 |  |-- role-list.vue		role列表页面
 |  |-- role-add. vue		role新建页面
 |  |-- role-update.vue		role更新页面
 |  |-- index.less			role模块样式
 |  |-- components			role模块通用组件文件夹
 |  |-- employee			employee模块

1. api 目录

  • 文件、变量命名要与后端保持一致。
  • 此目录对应后端 API 接口,按照后端一个controller 一个api.js文件。若项目较大时,可以按照业务划分子目录,并与后端保持一致。
  • api中的方法名字要与后端 api url 尽量保持语义高度一致性。
  • 对于 api中的每个方法要添加注释,注释与后端swagger 接口文档保持一致。

正例:

后端ulr:EmployeeController.java

/employee/add
/employee/delete/id
/employee/update

前端:employee.js

//添加员工
addEmployee:(data)=>{
	rerutn postAxios('/employee/add',data)
}
//更新员工
updateEmployee:(data)=>{
	rerutn postAxios('/employee/update',data)
}
//删除员工
deleteEmployee:(employeeId)=>{
	rerutn postAxios('/employee/delete/'+employeeId)
}

2. assets目录
assels 为静态资源,里面存放 images,styles,icons等静态资源,静态资源命名格式为 kebab-case

|-- assets
|-- images
|  |-- background-color.png
|  |-- upload-header.png
|-- styles

3.components目录
此目录应按照组件进行目录划分,目录命名为KebabCase,组件命名规则也为KebabCase

|--  error-log
|  |--index.vue
|  |-- index.less
|-- markdow-editor
|  |--index.vue
|  |--index.js
|-- kebab-case

4.constants 目录
此目录存放项目所有常量,如果常量在vue 中使用,请使用vue-enum 插件(https://gitee.com/lab1024/vue-enum)
vue-enum
目录结构:

|--  index.js
|--  role.js
|--  employee.js

例子:index.js

export let enumInfo = {
    SOURCE_IN_TYPE: {
        PURCHASE_IN: {
            value: 1,
            desc: '采购入库'
        },
        REFUND_IN: {
            value: 2,
            desc: '退货入库'
        },
        CHECK_IN: {
            value: 3,
            desc: '盘点入库'
        },
        CONFIRM_IN: {
            value: 4,
            desc: '取消订单入库'
        }
    }
}

5.router与store 目录

这两个目录一定要将业务进行拆分,不能放到一个文件里。
router 尽量按照 views 中的结构保持一致
srore 按照业务进行拆分不同的正文件

6.views 目录

  • 命名要与后端、router、api等保持一致
  • components 中组件要使用 Pascalcase 规则
|-- views				视图目录
|  |-- role				role模块名
|  |-- role-list.vue		role列表页面
|  |-- role-add. vue		role新建页面
|  |-- role-update.vue		role更新页面
|  |-- index.less			role模块样式
|  |-- components			role模块通用组件文件夹
|  |  |-- role-header.vue			role头部组件
|  |  |-- role-modal.vue			role弹出窗组件
|  |-- employee			employee模块
|  |-- behavior-log		行为日志log模块
|  |-- code-generator	代码生成器模块
👉2.4、注释说明

整理必须加注释的地方

  • 公共组件使用说明
  • api 目录的接口js 文件必须加注释
  • store 中的 state,mutation, action等必须加注释
  • vue 文件中的template 必须加注释,若文件较大添加 slart end 注释
  • vue 文件的 methods,每个method 必须添加注释
  • vue 文件的 data,非常见单词要加注释
👉2.5、其他
  1. 尽量不要手动操作 DOM
    因使用 vue 框架,所以在项目开发中尽量使用 vue 的数据驱动更新 DOM,尽量(不到万不得已)不要手动操作DOM,包括:增删改 dom 元素、以及更改样式、添加事件等
  2. 删除无用代码
    因使用了 git/svn 等代码版本工具,对于无用代码必须及时删除,例如:一些调试的console 语句、无用的弃用功能代码.

✒️总结

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端端或者对python感兴趣的朋友,请多多关注💖💖💖,咱们一起探讨和努力!!!
👨‍🔧 个人主页 : 前端初见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<数据集>车辆识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3002张 标注数量(xml文件个数)&#xff1a;3002 标注数量(txt文件个数)&#xff1a;3002 标注类别数&#xff1a;21 标注类别名称&#xff1a;[ambulance, army vehicle, auto rickshaw, bicycle, bus, car, garba…

互联网平台大模型网络架构设计

字节跳动&#xff1a;大模型网络实践分享 自2019年起&#xff0c;字节跳动公司便开始着手白盒项目。2020年&#xff0c;推出了首款接入交换机——25G型号&#xff0c;随后逐步实现软硬件的自主研发。在当前一代产品中&#xff0c;已经实现了100G接入、25.6T400G互联&#xff0c…

SprinBoot+Vue实验室考勤管理小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

信息学奥赛一本通/openjudge Crossing River

题目 一本通题目入口 openjudge题目入口 &#xff08;注&#xff1a;由于一本通题面描述的可能有些欠缺&#xff0c;所以这里的题面采用openjudge英文翻译后的题面&#xff09; 题目分析 首先我们来看样例&#xff0c;为什么样例的结果是17呢?首先观察&#xff0c;“5”和“…

node环境安装、vue-cli搭建过程、element-UI搭建使用过程

vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff1b;预先定义好的目录结构及基础代码&#xff0c;就好比咱们在创建 Maven 项目时可以选择创建一个骨架项目&#xff0c;这个骨架项目就是脚手架&#xff0c;我们的开发更加的快速 前端项目架…

Spark-Job启动、Stage划分

一、上下文 《Spark-driver和executor启动过程》详细分析了driver和executor的启动&#xff0c;此时资源已经给我们分配好了&#xff0c;且Application也已经注册完成。下面我们就来看看Spark是如何启动job并根据DAG来划分Stage的 二、Job启动 Spark RDD中的算子分为Transfo…

leetcode算法题之 K 个一组翻转链表

照我说这道题其实是披着困难皮的中等题目&#xff0c;问题如下&#xff1a; 题目地址 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍…

深入解析多商户商城系统源码:如何开发直播商城小程序?

本篇文章&#xff0c;小编将深入解析多商户商城系统源码的关键技术&#xff0c;并详细探讨如何基于这些源码开发一个功能完善的直播商城小程序。 一、多商户商城系统源码的核心构架 多商户商城系统源码的核心在于其能够支持多个商户独立运营&#xff0c;但同时又在一个统一的平…

(转载)内存分配器101——写一个简单的内存分配器

文章目录 前提正文Malloc()free()calloc()realloc() 前提 之前学习过手写一个简单的内存分配器&#xff0c;原文是英文的&#xff0c;当初学习的时候便将英文翻译为中文的&#xff0c;方便阅读&#xff0c;当然和原文相比少了点味道。今天整理资料的时候看到了自己的翻译&…

为什么越来越多的助贷中介公司做债务重组?

大家有没有注意到个现象&#xff1f;现在越来越多的助贷中介公司和专门做债务重组的公司一起“合作”了。有的是接了单转手给重组公司&#xff0c;有的则是亲自下场&#xff0c;用自有资金做起了重组的事情。为什么会这样呢&#xff1f;好端端的贷款中介不做&#xff0c;偏要蹚…

RabbitMQ练习(Remote procedure call (RPC))

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考&#xff1a;《RabbitMQ练习&#xff08;Hello World&#xff09;》。 确保RabbitMQ、Sender、Receiver容器正常安装和启动。 rootk0test1:~# docker run -it --rm --name rab…

前端内存泄露案例与解决方案

什么是内存泄漏&#xff1f; 内存泄露&#xff08;Memory Leaks&#xff09;&#xff1a;是指应用程序已经不再需要的内存&#xff0c;由于某种原因未返回给操作系统或者空闲内存池&#xff08;Pool of Free Memory&#xff09;。 内存泄露可能带来的问题&#xff1a;变慢、卡…

SAP LE学习笔记07 - MM与WM跨模块收货到仓库的流程中 如何实现 先上架再入库

上一章讲了LE中收货的一些特殊情况&#xff1a; 1&#xff0c;MM模块收货时&#xff0c;特别移动指标来标识的物料直接产生TO 2&#xff0c;MM中直接收货到仓库的固定Storage Bin(棚番)上 SAP LE学习笔记06 - MM与WM跨模块收货到仓库的流程中 带特别移动指标的物料也可以直接…

spring security 会话管理

一、简介 当浏览器调用登录接口登录成功后&#xff0c;服务端会和浏览器之间建立一个会话(Session)浏览器在每次发送请求时都会携带一个 Sessionld&#xff0c;服务端则根据这个 Sessionld 来判断用户身份当浏览器关闭后&#xff0c;服务端的 Session 并不会自动销毁&#xff0…

结构型设计模式-适配器(adapter)模式-python实现

设计模式汇总&#xff1a;查看 通俗示例 想象一下&#xff0c;你刚从国外带回一台最新的笔记本电脑&#xff0c;但是你发现它的电源插头是德标插头&#xff0c;而家里的电源插座是中式插座&#xff0c;这时怎么办呢&#xff1f;你需要一个电源适配器来将德标插头转换成中式插座…

“萌宠经济”全球化浪潮:宠物品牌如何利用TikTok达人破局出海

在全球“萌宠经济”不断升温的背景下&#xff0c;宠物品牌出海成为了重要的战略。随着市场的增长和消费者对宠物产品的需求增加&#xff0c;品牌需要寻找有效的方式进入新的海外市场。在这种情况下&#xff0c;TikTok平台的崛起和宠物达人的影响力成为了宠物品牌破局出海的关键…

数据结构与算法(快速基础C++版)

数据结构与算法&#xff08;快速基础C版&#xff09; 1. 基本概念第1章 绪论1.1 数据结构的研究内容1.2 基本概念和术语1.2.1 数据、数据元素、数据项和数据对象1.2.2 数据结构1.2.3 数据类型和抽象数据类型1.2.4 概念小结 1.3 算法和算法分析1.4 总结 2. 基本的数据结构第2章 …

【PyTorch常用库函数】一文教你快速上手torch.abs()函数:获取张量的绝对值

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在深度学习领域&#xff0c;PyTorch是一个非常受欢迎的框架&#xff0c;它提供了丰富的库函数来支持各种复杂的计算任务。…

利用Leaflet.js创建交互式地图:多种形状单个区域绘制

引言 在地图应用开发中&#xff0c;用户经常需要对特定区域进行标识和规划。本文将深入探讨如何利用Vue.js的响应式特性与Leaflet.js的地图功能&#xff0c;打造一个支持多边形、矩形、圆形等多种形状绘制的交互式地图编辑器。 功能亮点 自由绘制多边形&#xff1a;用户可以自…

mysql基础语法——个人笔记

0 前言 以前学习且实践过mysql&#xff0c;但后来用得少&#xff0c;随着岁月更替&#xff0c;对其印象渐浅&#xff0c;所以每次需要用时&#xff0c;都会去再看一眼语法规范&#xff0c;然后才能放心动手操作 然而&#xff0c;在信息爆炸的时代&#xff0c;查语法规范时&am…