编码规范集合

news2025/1/11 12:55:31

文章目录

  • 前言
  • 命名规范
        • 项目命名
        • 目录命名
        • 文件命名
        • 命名严谨性
  • HTML 书写规范
        • 结构、样式、行为分离
        • 缩进
        • 文件编码
        • 语义化
        • IE 兼容模式
        • viewport
        • 为移动端设备优化,设置可见区域的宽度和初始缩放比例
        • iOS 图标
        • favicon(网站图标,移动端默认可用于添加到桌面)
        • 一律使用小写元素名
        • 关闭所有 HTML 元素
        • Class 与 ID
        • 关闭空的 HTML 元素
        • 使用小写属性名
        • 属性值
        • 图片属性
        • 空格和等号
        • 空行和缩进
        • 样式表
        • 在 HTML 中的 script 标签
        • 省略外链资源 URL 协议部分
  • CSS 书写规范
        • 代码组织
        • Class 和 ID
        • 类选择器口诀
        • 声明顺序
        • 引号使用
        • 媒体查询(Media query)的位置
        • 不要使用 @import
        • 链接的样式顺序:
        • 使用 vw 作为单位时的简便计算
  • JavaScript 书写规范
      • 命名
      • 块级作用域
      • 强类型检查
      • 变量
      • 函数
      • 条件语句
      • 字符串
      • 解构赋值
      • 数组
      • 对象
  • Vue 开发相关规范
      • 组件规范
          • 1、组件名为多个单词
          • 2、组件文件名为 pascal-case 格式
          • 3、基础组件文件名为 base 开头,使用完整单词而不是缩写
          • 4、和父组件紧密耦合的子组件应该以父组件名作为前缀命名
          • 5、在 Template 模版中使用组件,应使用 PascalCase 模式,并且使用自闭合组件
          • 6、组件的 data 必须是一个函数
          • 7、Prop 定义应该尽量详细
          • 8、为组件样式设置作用域(使用 `scoped` 属性)
          • 9、如果特性元素较多,应该主动换行
      • 指令都使用缩写形式
      • 标签顺序保持一致
      • 必须为 v-for 设置键值 key
      • v-show 与 v-if 选择
      • Vue Router 规范
          • 1、页面跳转数据传递使用路由参数
          • 2、使用路由懒加载(延迟加载)机制
          • 3、router 中的命名规范
          • 4、router 中的 path 命名规范
          • 5、router 规范
      • service 目录规范
      • 其他
          • 1、尽量不要手动操作 DOM
          • 2、删除无用代码(因使用了 Git/SVN 版本管理,应及时一些调试代码及无用弃用的代码)


前言

现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全。对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。


命名规范

项目命名

全部采用小写方式, 以中划线分隔。

正例:mall-management-system
反例:mall_management-system | mallManagementSystem

目录命名

全部采用小写方式, 以中划线分隔,有复数结构时,要采用复数命名法, 缩写不用复数

正例: scripts | styles | components | images | utils | layouts | demo-styles | demo-scripts | img | doc
反例: script | style | demo_scripts | demoStyles | imgs | docs

【特殊】VUE 的项目中的 components 中的组件目录,使用 kebab-case 命名

正例: head-search | page-loading | authorized | notice-icon
反例: HeadSearch | PageLoading

【特殊】VUE 的项目中的除 components 组件目录外的所有目录也使用 kebab-case 命名

正例: page-one | shopping-car | user-management
反例: ShoppingCar | UserManagement

文件命名

全部采用小写方式, 以中划线分隔

正例: render-dom.js / signup.css / index.html / company-logo.png
反例: renderDom.js / UserManagement.html

命名严谨性

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。

!> 注意,即使纯拼音命名方式也要避免采用

正例:henan | luoyang | rmb 等国际通用的名称,可视同英文。
反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3

!> 杜绝完全不规范的缩写,避免望文不知义:反例:AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。

HTML 书写规范

结构、样式、行为分离

尽量确保文档和模板只包含 HTML 结构,样式都放到样式表里,行为都放到脚本里。

缩进

统一两个空格缩进(总之缩进统一即可),不要使用 Tab 或者 Tab、空格混搭。

文件编码
  • 使用不带 BOM 的 UTF-8 编码。
  • 在 HTML 中指定编码 <meta charset="utf-8">
  • 无需使用 @charset 指定样式表的编码,它默认为 UTF-8;
语义化

没有 CSS 的 HTML 是一个语义系统而不是 UI 系统。

通常情况下,每个标签都是有语义的,此外语义化的 HTML 结构,有助于机器(搜索引擎)理解,另一方面多人协作时,能迅速了解开发者意图。

IE 兼容模式

优先使用最新版本的 IE 和 Chrome 内核

<meta http-equid="X-UI-Compatible" content="IE=edge,chrome=1" />
viewport

一般指的是浏览器窗口内容区的大小,不包含工具条、选项卡等内容;

viewport 是用户网页的可视区域。

手机浏览器是把页面放在一个虚拟的"窗口"(viewport)中,通常这个虚拟的"窗口"(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机浏览器优化的网页的布局),用户可以通过平移和缩放来看网页的不同部分。

  • width: 浏览器宽度,输出设备中的页面可见区域宽度;
  • device-width: 设备分辨率宽度,输出设备的屏幕可见宽度;
  • initial-scale: 初始缩放比例;
  • minimum-scale:允许用户缩放到的最小比例。
  • maximum-scale: 最大缩放比例;
  • user-scalable:用户是否可以手动缩放。
为移动端设备优化,设置可见区域的宽度和初始缩放比例
<meta
  name="viewport"
  content="width=device-width, initial-scale=1  user-scalable=no"
/>
iOS 图标
  • apple-touch-icon 图片自动处理成圆角和高光等效果;
  • apple-touch-icon-precomposed 禁止系统自动添加效果,直接显示设计原图;
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link
  rel="apple-touch-icon-precomposed"
  sizes="152x152"
  href="gitbook/images/apple-touch-icon-precomposed-152.png"
/>
favicon(网站图标,移动端默认可用于添加到桌面)

在未指定 favicon 时,大多数浏览器会请求 Web Server 根目录下的 favicon.ico 。为了保证 favicon 可访问,避免 404,必须遵循以下两种种方法之一:

  • 在 Web Server 根目录放置 favicon.ico 文件;
  • 使用 link 指定 favicon(SPA 推荐直接使用 base64, 多页模式直接使用相对路径的 ico 文件);
<link
  rel="shortcut icon"
  href="gitbook/images/favicon.ico"
  type="image/x-icon"
/>
一律使用小写元素名

推荐使用小写字母:

  • 混合了大小写的风格是非常糟糕的。
  • 开发人员通常使用小写 (类似 XHTML)。
  • 小写风格看起来更加清爽。
  • 小写字母容易编写。
<!-- 推荐 -->
<section>
  <p>这是一个段落。</p>
</section>
/* 推荐 */
color: #d5d5d5;
/* 不好 */
/* COLOR: #d5d5d5; */
关闭所有 HTML 元素

在 HTML5 中, 你不一定要关闭所有元素 (例如 <p> 元素),但我们建议每个元素都要添加关闭标签。

  • 自闭合(self-closing)标签,无需闭合 ( 例如: img input br hr 等 );
  • 可选的闭合标签(closing tag),需闭合 ( 例如:
  • 或 );
  • 尽量减少标签数量;
Class 与 ID
  • class 应以功能或内容命名,不以表现形式命名;
  • class 与 id 单词字母小写,多个单词组成时,采用中划线-分隔;
  • 使用唯一的 id 作为 Javascript hook, 同时避免创建无样式信息的 class;
关闭空的 HTML 元素

在 HTML5 中, 空的 HTML 元素必须关闭:

<!-- 我们可以这么写: -->
<meta charset="utf-8" />
目前在HTML中有以下这些空元素: <area>
<base>
<br>
<col>
<colgroup>
<command>
<embed>
<hr>
<img>
<input>
<keygen>
<link>
<meta>
<param>
<source>
<track>
<wbr>
使用小写属性名

HTML5 属性名允许使用大写和小写字母,但我们要求使用小写字母属性名:

  • 同时使用大小写是非常不好的习惯。
  • 开发人员通常使用小写 (类似 XHTML)。
  • 小写风格看起来更加清爽。
  • 小写字母容易编写。
属性值

HTML5 属性值可以不用引号,但是我们要求必须使用引号:

  • 如果属性值含有空格需要使用引号。
  • 混合风格不推荐的,建议统一风格。
  • 属性值使用引号易于阅读。
图片属性

图片通常使用 alt 属性。 在图片不能显示时,它能替代图片显示。

定义好图片的尺寸,在加载时可以预留指定空间,减少闪烁。

空格和等号

等号前后必须使用空格

<!-- 推荐 -->
<link rel="stylesheet" href="styles.css" />
<!-- 不推荐 -->
<link rel\ =\ "stylesheet" href\ =\ "styles.css" />
空行和缩进
  • 为每个逻辑功能块添加空行,这样更易于阅读。
  • 缩进使用两个空格,不建议使用 TAB。
  • 比较短的代码间不要使用不必要的空行和缩进。
样式表

样式表使用简洁的语法格式 ( type 属性不是必须的)

<link rel="stylesheet" href="styles.css" />

内嵌样式规则:

  • 将左花括号与选择器放在同一行。
  • 左花括号与选择器间添加一个空格。
  • 使用两个空格来缩进。
  • 冒号与属性值之间添加一个空格。
  • 逗号和符号之后使用一个空格。
  • 每个属性与值结尾都要使用分号。
  • 只有属性值包含空格时才使用引号。
  • 右花括号放在新的一行。
p.into {
  font-family: Verdana;
  font-size: 16em;
}
在 HTML 中的 script 标签
  • 标签的 type 属性不是必须的
  • 请加上 defer 属性
省略外链资源 URL 协议部分

省略外链资源(图片及其它媒体资源)URL 中的 http / https 协议,使 URL 成为相对地址,避免 Mixed Content 问题,减小文件字节数。

其它协议(ftp 等)的 URL 不省略。

CSS 书写规范

代码组织
  • 以组件为单位组织代码段;
  • 制定一致的注释规范;
  • 组件块和子组件块以及声明块之间使用一空行分隔,子组件块之间三空行分隔;
  • 如果使用了多个 CSS 文件,将其按照组件而非页面的形式分拆,因为页面会被重组,而组件只会被移动;

良好的注释是非常重要的。请留出时间来描述组件(component)的工作方式、局限性和构建它们的方法。不要让你的团队其它成员 来猜测一段不通用或不明显的代码的目的。

Class 和 ID
  • 使用语义化、通用的命名方式;
  • 使用连字符 - 作为 ID、Class 名称界定符,不要驼峰命名法和下划线;
  • 避免选择器嵌套层级过多,尽量少于 3 级;
  • 避免选择器和 Class、ID 叠加使用;

出于性能考量,在没有必要的情况下避免元素选择器叠加 Class、ID 使用。

元素选择器和 ID、Class 混合使用也违反关注分离原则。如果 HTML 标签修改了,就要再去修改 CSS 代码,不利于后期维护。

类选择器口诀

样式点定义,结构类(class)调用,一个或多个,开发最常用

  • 类选择器使用"."进行标识,后面紧跟类名(自定义);
  • 可以理解为给这个标签起一个名字;
  • 长名称或者词组可以使用中横线来为选择器命名;
  • 不要使用纯数字、中文等命名,尽量使用英文字母来表示;
  • 命名要有意义,尽量使别人一眼就知道这个类名的目的;
声明顺序

相关属性应为一组,推荐的样式编写顺序,保证更好的可读性和可扫描重要

  • Positioning
  • Box model
  • Typographic
  • Visual

由于定位(positioning)可以从正常的文档流中移除元素,并且还能覆盖盒模型(box model)相关的样式,因此排在首位。盒模型决定了组件的尺寸和位置,因此排在第二位。
其他属性只是影响组件的内部(inside)或者是不影响前两组属性,因此排在后面。
作为最佳实践,我们应该遵循以下顺序(应该按照下表的顺序):

结构性属性:

  • display
  • position, left, top, right
  • overflow, float, clear
  • margin, padding

表现性属性:

  • background, border
  • font, text
引号使用

url() 、属性选择符、属性值使用双引号。

媒体查询(Media query)的位置

将媒体查询放在尽可能相关规则的附近。不要将他们打包放在一个单一样式文件中或者放在文档底部。如果你把他们分开了,将来只会被大家遗忘。

不要使用 @import

与 <link> 相比,@import 要慢很多,不光增加额外的请求数,还会导致不可预料的问题。

替代办法:

  • 使用多个 元素;
  • 通过 Sass 或 Less 类似的 CSS 预处理器将多个 CSS 文件编译为一个文件;
  • 其他 CSS 文件合并工具;
链接的样式顺序:

a:link -> a:visited -> a:hover -> a:active(LoVeHAte)

选择字体

在 Web 上应用字体,是一门技术,同时也是一门艺术. 由于计算机历史发展的原因,西文有大量优秀的字体可供选择,可对于中文来说就是一项挑战. 主流操作系统提供的本地中文字体极少,另一方面中文字体组成的特殊性,其体积过于庞大,无法良好地使用 webfont. 所以编写健壮的 font-family 是一件需要深思熟虑的事情.

使用 vw 作为单位时的简便计算

以 iphone6 为标准的 750*1334px 的设计稿为例,在 scss 中使用如下方法,可以直接使用设计稿上面的标志,快速编写 css,免于转换计算

@function vw($px) {
  @return ($px / 750) * 100vw;
}

div {
  width: vw(101);
}

JavaScript 书写规范

命名

  • 采用小写驼峰命名 lowerCamelCase,代码中的命名均不能以下划线,也不能以下划线或美元符号结束。

    Bad: _name | name_ | name$;

  • 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。

    Good: localValue | getHttpMessage() | inputUserId

  • 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。

    例子: Good: MAX_STOCK_COUNT; Bad: MAX_COUNT

!> 其中 method 方法命名强调 动词 或者 动词+名词 形式

附: 函数方法常用的动词(点击展开):
// get 获取/set 设置,
// add 增加/remove 删除
// create 创建/destory 移除
// start 启动/stop 停止
// open 打开/close 关闭,
// read 读取/write 写入
// load 载入/save 保存,
// create 创建/destroy 销毁
// begin 开始/end 结束,
// backup 备份/restore 恢复
// import 导入/export 导出,
// split 分割/merge 合并
// inject 注入/extract 提取,
// attach 附着/detach 脱离
// bind 绑定/separate 分离,
// view 查看/browse 浏览
// edit 编辑/modify 修改,
// select 选取/mark 标记
// copy 复制/paste 粘贴,
// undo 撤销/redo 重做
// insert 插入/delete 移除,
// add 加入/append 添加
// clean 清理/clear 清除,
// index 索引/sort 排序
// find 查找/search 搜索,
// increase 增加/decrease 减少
// play 播放/pause 暂停,
// launch 启动/run 运行
// compile 编译/execute 执行,
// debug 调试/trace 跟踪
// observe 观察/listen 监听,
// build 构建/publish 发布
// input 输入/output 输出,
// encode 编码/decode 解码
// encrypt 加密/decrypt 解密,
// compress 压缩/decompress 解压缩
// pack 打包/unpack 解包,
// parse 解析/emit 生成
// connect 连接/disconnect 断开,
// send 发送/receive 接收
// download 下载/upload 上传,
// refresh 刷新/synchronize 同步
// update 更新/revert 复原,
// lock 锁定/unlock 解锁
// check out 签出/check in 签入,
// submit 提交/commit 交付
// push 推/pull 拉,
// expand 展开/collapse 折叠
// begin 起始/end 结束,
// start 开始/finish 完成
// enter 进入/exit 退出,
// abort 放弃/quit 离开
// obsolete 废弃/depreciate 废旧,
// collect 收集/aggregate 聚集

块级作用域

let 取代 var,在 letconst 之间,建议优先使用 const,尤其是在全局环境,不应该设置变量,只应设置常量。

强类型检查

=== 代替 ==

0 == false; // true
0 === false; // false
2 == '2'; // true
2 === '2'; // false

// 例子
const value = '500';
if (value === 500) {
  console.log(value);
}

if (value === '500') {
  console.log(value);
}

变量

1、给变量命名时,应该要使变量名具有代表意图的象征,使人易于搜索并且容易理解。

Bad:

let daysSLV = 10;
let y = new Date().getFullYear();

let ok;
if (user.age > 30) {
  ok = true;
}

Good:

const MAX_AGE = 30;
let daysSinceLastVisit = 10;
let currentYear = new Date().getFullYear();
...
const isUserOlderThanAllowed = user.age > MAX_AGE;

2、不要在变量名中增加没必要额外的单词

Bad:

let nameValue;
let theProduct;

Good:

let name;
let product;

3、不要强制记忆变量名的上下文

Bad:

const users = ['John', 'Marco', 'Peter'];
users.forEach((u) => {
  doSomething();
  doSomethingElse();
  // ...
  register(u);
});

Good:

const users = ['John', 'Marco', 'Peter'];
users.forEach((user) => {
  doSomething();
  doSomethingElse();
  // ...
  register(user);
});

4、变量名不要加上下文重复的单词

Bad:

const user = {
  userName: "John",
  userSurname: "Doe",
  userAge: "28"
};
...
user.userName;

Good:

const user = {
  name: "John",
  surname: "Doe",
  age: "28"
};
...
user.name;

函数

1、函数名应该是动词或者短语,代表某种行为,描述它们在做什么

Bad:

function notif(user) {
  // ...
}

Good:

function notifyUser(emailAddress) {
  // ...
}

2、避免使用大量的参数,理想的情况就是用两个或者更少的参数。参数越少,测试就越容易

Bad:

function getUsers(fields, fromDate, toDate) {
  // implementation
}

Good:

function getUsers({ fields, fromDate, toDate }) {
  // implementation
}

getUsers({
  fields: ['name', 'surname', 'email'],
  fromDate: '2019-01-01',
  toDate: '2019-01-18'
});

3、一个函数应该做一件事,避免在一个函数中执行多个操作。

Bad:

function notifyUsers(users) {
  users.forEach((user) => {
    const userRecord = database.lookup(user);
    if (userRecord.isVerified()) {
      notify(user);
    }
  });
}

Good:

function notifyVerifiedUsers(users) {
  users.filter(isUserVerified).forEach(notify);
}

function isUserVerified(user) {
  const userRecord = database.lookup(user);
  return userRecord.isVerified();
}

4、使用 Object.assign 设置默认对象。

Bad:

const shapeConfig = {
  type: 'cube',
  width: 200,
  height: null
};
function createShape(config) {
  config.type = config.type || 'cube';
  config.width = config.width || 250;
}
createShape(shapeConfig);

Good:

const shapeConfig = {
  type: 'cube',
  width: 200
  // ...
};

function createShape(config) {
  config = Object.assign(
    {
      type: 'cube',
      width: 250
      // ...
    },
    config
  );
  // ...
}

createShape(shapeConfig);

5、不要使用标志记作为参数,因为它们告诉你该函数正在做的比它应该做的更多。

Bad:

function createFile(name, isPublic) {
  if (isPublic) {
    fs.create(`./public/${name}`);
  } else {
    fs.create(name);
  }
}

Good:

function createFile(name) {
  fs.create(name);
}

function createPublicFile(name) {
  createFile(`./public/${name}`);
}

6、不要污染全局变量。如果需要扩展现有对象,请使用 ES6 类和继承,而不是在现有对象的原型链上创建函数

Bad:

Array.prototype.myFunc = function myFunc() {
  // ...
};

Good:

class SuperArray extends Array {
  myFunc() {
    // ...
  }
}

7、重要函数或者类等都要添加头描述

条件语句

1、使用条件语句尽量短点。这可能是微不足道的,但值得一提。此方法仅用于布尔值,并且如果您确定该值不是未定义的或为 null

Bad:

if (isValid === true) {
  // ...
}

if (isValid === false) {
  // ...
}

Good:

if (isValid) {
  // ...
}

if (!isValid) {
  // ...
}

2、尽可能避免 switch 分支,请改用多态和继承。

字符串

1、应使用数组保存字符串片段,使用时调用 join 方法。避免使用+或+=的方式拼接较长的字符串,每个字符串都会使用一个小的内存片段,过多的内存片段会影响性能

2、静态字符串一律使用单引号或反引号,不使用双引号。动态字符串使用反引号。

解构赋值

1、使用数组成员对变量赋值时,优先使用解构赋值。

Bad:

const arr = [1, 2, 3, 4];

const first = arr[0];
const second = arr[1];

Good:

const [first, second] = arr;

2、函数的参数如果明确是对象的成员,优先使用解构赋值。

3、如果函数返回多个值,优先使用对象的解构赋值,而不是数组的解构赋值。这样便于以后添加返回值,以及更改返回值的顺序。

4、不要在函数体内使用 arguments 变量,使用扩展运算符(...)代替。

数组

1、使用扩展运算符(...)拷贝数组。使用Array.from方法,将类似数组的对象转为数组。

const a1 = [1, 2, 3];
const b1 = [...a1];

const h3List = Array.from(document.querySelectorAll('h3'));

2、如果单纯判断每个数组元素存在。使用Array.includes方法。

const a1 = [1, 2, 3];
const b1 = [...a1];

const h3List = Array.from(document.querySelectorAll('h3'));

对象

1、尽量不要使用 new 命令,改用 Object.create() 或者对象字面量

// 对象字面量
const lang = { name: 'Javascript' };

const lang = Object.create({ name: 'JavaScript' });

在这里插入图片描述

Vue 开发相关规范

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

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

组件规范

1、组件名为多个单词

Good:

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

Bad:

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

Good:

components/
  |- my-component.vue

Bad:

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

Good:

components/
  |- base-button.vue

Bad:

components/
  |- MyButton.vue
4、和父组件紧密耦合的子组件应该以父组件名作为前缀命名

Good:

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

Bad:

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

Good:

<!-- 在单文件组件、字符串模板和 JSX-->
<MyComponent />
<Row><table :column="data"/></Row>

Bad:

<my-component /> <row><table :column="data"/></row>
6、组件的 data 必须是一个函数

当在组件中使用 data 属性的时候 (除了 new Vue 外的任何地方),它的值必须是返回一个对象的函数。 因为如果直接是一个对象的话,子组件之间的属性值会互相影响。

7、Prop 定义应该尽量详细
  • 必须使用 camelCase 驼峰命名
  • 必须指定类型
  • 必须加上注释,表明其含义
  • 必须加上 required 或者 default,两者二选其一
  • 如果有业务需要,必须加上 validator 验证

Good:

props: {
  // 组件状态,用于控制组件的颜色
   status: {
     type: String,
     required: true,
     validator: function (value) {
       return [
         'succ',
         'info',
         'error'
       ].indexOf(value) !== -1
     }
   },
    // 用户级别,用于显示皇冠个数
   userLevel:{
      type: String,
      required: true
   }
}
8、为组件样式设置作用域(使用 scoped 属性)
9、如果特性元素较多,应该主动换行

Good:

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

指令都使用缩写形式

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

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

Bad:

<input
  v-on:input="onInput"
  @focus="onFocus"
>

标签顺序保持一致

// 保持以下顺序
<template>...</template>
<script>...</script>
<style>...</style>

必须为 v-for 设置键值 key

v-show 与 v-if 选择

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

Vue Router 规范

1、页面跳转数据传递使用路由参数

页面跳转,例如 A 页面跳转到 B 页面,需要将 A 页面的数据传递到 B 页面,推荐使用 路由参数进行传参,而不是将需要传递的数据保存 vuex,然后在 B 页面取出 vuex 的数据,因为如果在 B 页面刷新会导致 vuex 数据丢失,导致 B 页面无法正常显示数据。

let id = '123';
this.$router.push({ name: 'userCenter', query: { id } });
2、使用路由懒加载(延迟加载)机制
3、router 中的命名规范

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

name 命名规范采用 KebabCase 命名规范且和 component 组件名保持一致!(因为要保持keep-alive特性,keep-alive按照 component 的name进行缓存,所以两者必须高度保持一致)

{
    path: '/n/task-calling',
    component: _import('tasks/calling/index'),
    name: 'taskCalling',
    desc: '外呼下单',
  },
4、router 中的 path 命名规范

path 除了采用 kebab-case 命名规范以外,必须以 / 开头,即使是 children 里的 path 也要以 / 开头

目的:经常有这样的场景:某个页面有问题,要立刻找到这个 vue 文件,如果不用以/开头,path 为 parent 和 children 组成的,可能经常需要在 router 文件里搜索多次才能找到,而如果以/开头,则能立刻搜索到对应的组件

5、router 规范

router 目录应根据项目进行业务分层,进行模块拆分,并尽量与 views 模块保持一致。

// router/index.js
import Router from 'vue-router';
import tasks from './modules/tasks';
import sys from './modules/sys';
import business from './modules/business';
import workbench from './modules/workbench';

// 路由定义使用说明:
// 代码中路由统一使用name属性跳转
const router = new Router({
  mode: 'hash',
  routes: [
    {
      path: '/404',
      component: _import('error/404'),
      name: '404',
      desc: '404未找到',
    },
    {
      path: '/login',
      component: _import('login/index'),
      name: 'login',
      desc: '登录',
    },
    {
      path: '/',
      component: _import('home/index'),
      name: 'home',
    },

    /*---- 系统管理 ------------------------------------------------------------- */
    ...sys,

    /*---- 业务管理 ------------------------------------------------------------- */
    ...business,

    /*---- 个人工作台 ------------------------------------------------------------- */
    ...workbench,

    /*---- 任务执行 ------------------------------------------------------------- */
    ...tasks,
  ]
};

service 目录规范

service 目录存放与后端接口相关的模块,包括接口路径定义,请求相关设置。接口定义必须按照后端结构进行定义。

// 实例
export const common = {
  captcha: 'captcha.jpg',
  login: 'sys/login',
  logout: 'sys/logout'
};

export const sys = {
  user: {
    list: 'sys/user/list',
    info: 'sys/user/info',
    updatePassword: 'sys/user/password',
    add: 'sys/user/save',
    update: 'sys/user/update',
    del: 'sys/user/delete',
    getUserInfo: 'sys/user/getUserInfo'
  },
  menu: {
    nav: 'sys/menu/nav',
    select: 'sys/menu/select',
    list: 'sys/menu/list',
    info: 'sys/menu/info',
    add: 'sys/menu/save',
    update: 'sys/menu/update',
    del: 'sys/menu/delete'
  }
};

其他

1、尽量不要手动操作 DOM
2、删除无用代码(因使用了 Git/SVN 版本管理,应及时一些调试代码及无用弃用的代码)

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

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

相关文章

微信小程序前端开发

目录 前言&#xff1a; 1. 框架选择和项目搭建 2. 小程序页面开发 3. 数据通信和接口调用 4. 性能优化和调试技巧 5. 小程序发布和上线 前言&#xff1a; 当谈到微信小程序前端开发时&#xff0c;我们指的是使用微信小程序框架进行开发的一种方式。在本文中&#xff0c;我…

100+ Windows运行命令大全,装B高手必备

操作电脑关闭、重启、注销、休眠的命令细则: 用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f] [/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]] 没有参数 显示帮助。这与键入 /? 是一样的。…

第七章 :Spring Boot web开发常用注解(二)

第七章 :Spring Boot web开发常用注解(二) 前言 本章节知识重点:作者结合自身开发经验,以及觉察到的一个现象:Springboot注解全面理解和掌握的并不多,对注解进行了全面总结,共分两个章节,可以作为web开发工程师注解参考手册,SpringBoot常用注解大全,一目了然!。本…

python机器学习——随机森林

随机森林 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;它通过构建多个决策树并结合它们的预测结果来进行分类或回归。 算法原理&#xff1a; 决策树&#xff08;Decision Tree&#xff09;: 随机森林由多个决策树组成。决策树是一种基于树…

增强地理热图:Highcharts Maps v11.2.0 Crack

Highcharts Maps v11.2.0 添加了对地理热图插值的支持&#xff0c;允许您在类似温度图的图表的已知数据点之间添加估计值。 Highcharts Maps 提供了一种符合标准的方法&#xff0c;用于在基于 Web 的项目中创建逻辑示意图。它扩展了用户友好的 Highcharts JavaScript API&#…

JTS: 18 DistanceToPoint 最近距离计算

这里写目录标题 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 import org.locationtech.jts.algorithm.distance.DistanceToPoint; import org.locationtech.jts.algorithm.distance.PointPairDistance; import org.locationtech.jts.geom.Coordin…

【Qt-23】ui界面设计-ToolBar

1、ToolBar 右击主窗体添加工具栏 新建动作&#xff0c;可设置图标&#xff0c;图标有本地文件和资源两种方式。 修改toolButtonStyle的属性&#xff0c;可设置图标与汉字显示的方式。 页面跳转&#xff1a; connect(ui->action, SIGNAL(triggered()), this, SLOT(openWid…

抖音直播矩阵玩法,直播矩阵引流项目,每日精准引流500左右

今天我再分享一个专注于纯直播带货的玩法&#xff0c;这个案例不论是导流还是直播模式&#xff0c;都值得我们深入关注。某音直播矩阵玩法&#xff0c;每日精准引流500 这种直播方式通常会邀请两位模特&#xff0c;一个展示产品&#xff0c;一个递交产品&#xff0c;无需过多的…

小程序开发——小程序页面的配置与生命周期

目录 1.小程序的页面配置 2.页面的生命周期 3.页面跳转 4.页面间的参数传递 5.新闻客户端案例讲解 6.小结 1.小程序的页面配置 页面的配置设置app.json中的window配置项的内容&#xff08;页面中配置项会覆盖app.json的window中相同的配置项&#xff09;&#xff0c;其属…

【狂神说Java】SpringCloud-Netflix

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

利用梯度上升可视化卷积核:基于torch实现

利用梯度上升可视化卷积核 文章目录 前言基本原理版本和包结果展示 简单绘图修改源码绘图方法一 方法二&#xff08;推荐&#xff09; 报错解决总结 前言 基于梯度上升的可视化是一种常用的技术&#xff0c;用于理解卷积神经网络&#xff08;CNN&#xff09;中的卷积核是如何对…

Kali常用配置(持续更新)

1. 同步系统时间 命令&#xff1a;dpkg-reconfigure tzdata &#xff0c;这个命令可以同时更新系统时间和硬件时间。 然后选择区域和城市&#xff0c;中国可以先选择Asia&#xff0c;然后选择Shanghai 2.更换系统数据源 # vim /etc/apt/sources.list #不是root用户的话需要…

ElasticSearch文档分析

ElasticSearch文档分析 包含下面的过程&#xff1a; 将一块文本分成适合于倒排索引的独立的 词条将这些词条统一化为标准格式以提高它们的“可搜索性”&#xff0c;或者 recall 分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里&#xff1a; 字符过滤器 首先&a…

PMCW体制雷达系列文章(1) – PMCW体制雷达综述

说明 相位调制连续波(Phase-modulated continuous wave, PMCW)雷达&#xff0c;或又被称为数字雷达&#xff0c;近年来开始被应用于汽车雷达领域。而且因其特有的一些优势(精度高、抗干扰能力强等)被认为是车载毫米波雷达的发展趋势之一(从目前占主导的调频连续波(Frequency-mo…

美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23

美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23 2023年10月13日&#xff0c;美国材料与试验协会&#xff08;ASTM&#xff09;发布了新版玩具安全标准ASTM F963-23 ​根据CPSIA的规定&#xff0c;当ASTM将ASTM F963的拟定修订意见通知CPSC时&#xff0c;若CPSC认为…

QRadioButton、QCheckBox样式表

QRadioButton、QCheckBox样式表 实现效果Chapter1 QRadioButton样式表详细描述示例效果源码样式表 Chapter2 QRadioButton样式表 实现效果 QRadioButton{spacing: 2px;color: white; } QRadioButton::indicator {width: 60px;height: 35px; } QRadioButton::indicator:unchecke…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(三)

员工分页查询和账号启用禁用功能 1. 员工分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 封装PageResult1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.4 代码完善 2. 启用禁用员工账号…

《QT从基础到进阶·二十》QThreadPool线程池的使用

什么情况下比较适合用线程池&#xff1f; 比如我有上百个任务要同时处理&#xff0c;难道开上百个线程&#xff1f;NO&#xff01;&#xff01;&#xff01; 有了线程池的加持&#xff0c;自动给任务分配线程处理&#xff0c; 多线程不再是真爱~ 线程池创建&#xff1a; 1、自…

CAS、Synchronized 原理

什么是CASCAS应用原子类自旋锁CAS的ABA问题 Synchronized 原理锁升级优化锁消除优化锁粗化优化 什么是CAS 什么是CAS&#xff1f;Compare and swap &#xff1a;比较和交换 一个CAS操作涉及&#xff1a; 我们假设内存中的原数据V&#xff0c;旧的预期值A&#xff0c;需要修改…

第六十一周周报

学习目标&#xff1a; 代码 实验 论文 学习时间&#xff1a; 2023.11.4-2023.11.10 学习产出&#xff1a; 代码 1、修改CelebA64数据集的代码&#xff0c;实验暂时没跑完 2、添加CB模块&#xff0c;实验暂时没跑完 3、修改ViTGAN的CIPS Generator位置编码为傅里叶编码 …