--- title: 2.2、Vue3规范 V2.0 date: 2022-09-07 --- ## 阅读须知 **在阅读《Java规范》之前,请一定先阅读上一篇《规范导读 V2.0》!!!** ,[前往阅读](./basic.md) ## 一、Vue3 基础规范 ### 1.1、项目命名 全部采用小写方式, 以中划线分隔。 ```javascript 正例:`smart-admin` 反例:`mall_management-system / mallManagementSystem` ``` ### 1.2、目录、文件命名 目录、文件名 均以 小写方式, 以中划线分隔。 ```javascript 正例:`/head-search/`、`/shopping-car/`、`smart-logo.png`、`role-form.vue` 反例:`/headSearch/`、 `smartLogo.png`、 `RoleForm.vue` ``` ### 1.3、单引号、双引号、分号 - html中、vue的template 中 标签属性 使用 **双引号** - 所有js中的 字符串 使用 **单引号** - 所有js中的代码行换行要用 **分号** ## 二、Vue3 组合式 API规范 ### 2.1、 使用setup语法糖 - 组件必须使用 `setup` 语法糖 - setup 大法方便简洁 - 全局都要使用setup语法糖 ### 2.2、组合式Composition API 规范 组件内必须使用模块化思想,把代码 进行 拆分; 参照 vue3官方文档对于 Composition Api的理解: [更灵活的代码组织](https://cn.vuejs.org/guide/extras/composition-api-faq.html#better-logic-reuse) ,组合式Api,即 Composition API 解决的是让 相互关联的代码在一起,以更方便的组织代码,故我们的代码格式如下: **即:将相关的 变量和代码 写到一起,并使用 行注释 进行分块** ```js ``` 举例,分成了两个模块,即: - 模块1:显示 、隐藏操作的 变量和方法 - 模块2:表单的 变量和方法 **【以下是正确的例子】** ```js ``` **【错误的例子】** ```js ``` ** vue 官方希望是 模块化的组织代码,你看记得官方这个图吗?**
**第一种写法,所有变量写到了一起,就像vue2的 data区域,所有方法写到一起,就像vue2中的 methods区域,这样下来其实和vue2没什么区别,也就语法稍微变了一下,那么就与composition api的初衷违背了**,下面引用官方的话 >处理相同逻辑关注点的代码被强制拆分在了不同的选项中,位于文件的不同部分。在一个几百行的大组件中,要读懂代码中的一个逻辑关注点,需要在文件中反复上下滚动,这并不理想。另外,如果我们想要将一个逻辑关注点抽取重构到一个可复用的工具函数中,需要从文件的多个不同部分找到所需的正确片段。 **SmartAdmin中的写法才真正做到了vue3组合式composition api的意图,每一块业务的变量与方法写到一起,比如上面代码中的`显示与隐藏`的变量和方法放到了一起,`表单`的变量和方法放到了一起**,下面引用官方的话 > 现在与同一个逻辑关注点相关的代码被归为了一组:我们无需再为了一个逻辑关注点在不同的选项块间来回滚动切换。此外,我们现在可以很轻松地将这一组代码移动到一个外部文件中,不再需要为了抽象而重新组织代码,大大降低了重构成本,这在长期维护的大型项目中非常关键。 ### 2.3 模板引用变量Ref 对于vue3中的模板引用ref,即 ref 是作为一个特殊的 attribute ```html ``` 我们要求: - 使用 ref方法,参数为空 进行声明变量 - 变量必须以 `Ref`为结尾 - template中的ref 也必须以 `Ref` 为结尾 比如上面的例子,我们声明如下 ```js const inputRef = ref(); ``` ### 2.4 变量和方法的注释 在使用Composition Api进行代码编写时,我们有效的组织了代码,但是由于Composition Api变量和方法会写到一起,这时候注释就变得很有必要 要求: - 变量必须都加上注释 - 方法必须加上注释 比如 ```js // 查询 公告 默认值 const queryFormState = { noticeTypeId: undefined, //分类 keywords: '', //标题、作者、来源 documentNumber: '', //文号 createUserId: undefined, //创建人 deletedFlag: undefined, //删除标识 createTimeBegin: null, //创建-开始时间 createTimeEnd: null, //创建-截止时间 publishTimeBegin: null, //发布-开始时间 publishTimeEnd: null, //发布-截止时间 pageNum: 1, pageSize: PAGE_SIZE, }; // 查询 公告 请求表单 const queryForm = reactive({ ...queryFormState }); ``` ## 三、Vue3 组件规范 ### 3.1、 组件文件名 组件文件名应该为 pascal-case 格式 正例: ```javascript components |- my-component.vue ``` 反例: ```javascript components |- myComponent.vue |- MyComponent.vue ``` ### 3.2、 父子组件文件名 和父组件紧密耦合的子组件应该以父组件名作为前缀命名 正例: ```javascript components |- todo-list.vue |- todo-list-item.vue |- todo-list-item-button.vue |- user-profile-options.vue (完整单词) ``` 反例: ```javascript components |- TodoList.vue |- TodoItem.vue |- TodoButton.vue |- UProfOpts.vue (使用了缩写) ``` ### 3.3、 组件属性 组件属性较多,应该主动换行。 正例: ```html ``` 反例: ```html ``` ### 3.4、 模板中表达式 组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。 正例: ```js // 复杂表达式已经移入一个计算属性 computed: { normalizedFullName: function () { ​ return this.fullName.split(' ').map(function (word) { ​ return word[0].toUpperCase() + word.slice(1) ​ }).join(' ') } } ``` 反例: ```js ``` ### 3.5、 标签顺序 单文件组件应该总是让标签顺序保持为 `