1、命名要规范

(1)普通变量和methods里面的方法名要用驼峰命名法,而且必须是跟需求的内容相关的英语单词
image.png
(2)命名是复数的时候需要加s
(3)只能读取不能编辑的常量要用匈牙利式命名法,全部大写
(4)自定义组件和封装的插件/方法要用驼峰命名法,而且首字母必须大写和必须是跟需求的内容相关的英语单词
image.png

2、结构化规范

(1)目录文件夹及子文件规范

  1. src 源码目录
  2. |-- api 接口,统一管理
  3. |-- assets 静态资源,统一管理
  4. |-- components 公用组件,全局文件
  5. |-- Format input框正则校验
  6. |-- icons 图标,全局资源
  7. |-- datas 模拟数据,临时存放
  8. |-- lib 外部引用的插件存放及修改文件
  9. |-- mock 模拟接口,临时存放
  10. |-- router 路由,统一管理
  11. |-- store vuex, 统一管理
  12. |-- views 视图目录
  13. | |-- staffWorkbench 视图模块名
  14. | |-- |-- staffWorkbench.vue 模块入口页面
  15. | |-- |-- indexComponents 模块页面级组件文件夹
  16. | |-- |-- components 模块通用组件文件夹

(2)vue 文件基本结构

  1. <template>
  2. <div>
  3. </div>
  4. </template>
  5. <script>
  6. export default {
  7. components : {
  8. },
  9. data () {
  10. return {
  11. }
  12. },
  13. mounted() {
  14. },
  15. methods: {
  16. }
  17. }
  18. </script>
  19. <!--声明语言,并且添加scoped-->
  20. <style lang="scss" scoped>
  21. </style>

(2)vue 文件基本结构

  1. - components
  2. - props
  3. - data
  4. - computed
  5. - created
  6. - mounted
  7. - metods
  8. - filter
  9. - watch

3、注释规范

务必添加注释列表

  • 公共组件使用说明
  • 各组件中重要函数或者类说明
  • 复杂的业务逻辑处理说明
  • 特殊情况的代码处理说明,对于代码中特殊用途的变量、存在临界值、函数中使用的 hack、使用
  • 了某种算法或思路等需要进行注释描述
  • 多重 if 判断语句
  • 注释块必须以/(至少两个星号)开头/
  • 单行注释使用//

4、编码规范

(1)指令规范

  1. :class="{'show-left':true}"
  2. @click="getListData"

(2)指令规范
v-for 循环必须加上 key 属性,在整个 for 循环中 key 需要唯一

  1. <ul>
  2. <li v-for="todo in todos" :key="todo.id">
  3. {{ todo.text }}
  4. </li>
  5. </ul>

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

  • 将数据替换为一个计算属性,让其返回过滤后的列表

    1. <ul>
    2. <li v-for="user in activeUsers" :key="user.id">
    3. {{ user.name }}
    4. </li>
    5. </ul>
    6. <script>
    7. computed: {
    8. activeUsers: function () {
    9. return this.users.filter(function (user) {
    10. return user.isActive
    11. })
    12. }
    13. }
    14. </script>
  • 将 v-if 移动至容器元素上 (比如 ul, ol)

    1. <ul v-if="shouldShowUsers">
    2. <li v-for="user in users" :key="user.id">
    3. {{ user.name }}
    4. </li>
    5. </ul>

    (4)console.log() debugger 使用完及时删除

(6)除了三目运算,if,else等禁止简写,该有的{}和;都要加上,不然看起来太累了
image.png
(7)接口调用几种情况都要写全
image.png

5、css规范

统一使用”-“连字符 省略值为 0 时的单位 如果 CSS 可以做到,就不要使用 JS 建议并适当缩写值,提高可读性,特殊情况除外

6、平时遇到需要的注意点

(1)如果使用buttonLoading 一定要把接口返回错误后 把按钮状态更改掉,不要让他一直转
image.png
(2)、关于switch开关的使用注意事项,因switch开关直接操作,不论接口是否正常,他都会进行改变,所以需要在接口不返回1的情况下,刷新列表接口,让其回复正常
image.png

7、封装插件的使用

关于input框正则校验插件的使用

(1)插件位置 :src/format,有新的验证直接追加
image.png
(2)在需要的页面引用

  1. import Format from "../../../format/format"
  1. export default {
  2. data() {
  3. return {
  4. rules: {
  5. realName:[
  6. {
  7. required: true,
  8. validator: Format.FormValidate.Form().realName,
  9. trigger: "change"
  10. }
  11. ],
  12. }
  13. }
  14. },
  15. methods: {
  16. saveEdit(formName) {
  17. let errorMsg = document.getElementsByClassName('el-form-item__error');
  18. this.$refs[formName].validate((valid) => {
  19. if (!valid) {
  20. return false;
  21. }
  22. });
  23. }
  24. }

image.png
image.pngimage.png
(3)还有一种情况需要注意,如果弹窗中有不合规范的填写,点击取消按钮后,在重新打开弹窗,错误提示会残留,这里需要加上以下代码

  1. // 添加/编辑操作
  2. handleEdit(index, row) {
  3. //初始值并移除校验结果
  4. if (this.$refs.ruleForm) {
  5. this.$refs.ruleForm.resetFields();
  6. }
  7. }

关于 el-cascader 的数据回显 插件的使用

解决问题:image.png
在点击编辑,数据回显时,我们需要根据所属的菜单id ,找出及其所有的父级id的合集才能正确回显
(1)插件位置 :src/getAllParent
image.png
(2)在需要的页面使用

  1. import { familyTree } from "../../../getAllParent/getAllParent"; //通过id找其所有父级id的合集

image.png

  1. this.form.parentIdArr = [];
  2. this.form.parentIdArr = familyTree(this.treeData,row.parentId);

在使用el-cascader时有一点需要注意的是,在编辑时他会记住上一次打开的状态,比如先点击了:
image.png
然后再点击另外一个,他还是会显示一部分上次展开的内容,
image.png
解决方法:给el-cascader加上key,就不会出现这样的问题了
image.png

  1. export default {
  2. name: 'Menus',
  3. data() {
  4. return {
  5. isResouceShow:0,
  6. }
  7. }
  8. }
  9. methods: {
  10. //编辑
  11. handleEdit(index, row) {
  12. ++this.isResouceShow;
  13. ........
  14. }
  15. }

自定义指令 实现动态全局按钮权限控制(v-has)

文件地址:src/btnControl

再main.js中全局引用

  1. import btnControl from './btnControl/btnControl';
  2. Vue.use(btnControl);

使用方法:在菜单管理中填写按钮编码,此编码是唯一性的,不可重复
image.png
然后再登录的时候

  1. //在sessionStorage中添加按钮数据
  2. _this.btnPermissions = ['btn_form_add','btn_form_edit','btn_form_delete']; //模拟数据
  3. sessionStorage.setItem("btnContext",JSON.stringify(_this.btnPermissions));

再需要的页面中直接使用v-has

  1. <el-button
  2. type="danger"
  3. icon="el-icon-delete"
  4. class="handle-del mr10"
  5. @click="delAllSelection"
  6. :disabled="isDisabl"
  7. v-has="'btn_form_delete'"
  8. >批量删除
  9. </el-button>

7、弹窗点击确认提交时的弹出的判空信息,统一用warning(黄色),不要用error(红色)和默认(黑灰色)

  1. if (!this.form.menuIcon) {
  2. this.$message({
  3. message: "图标不能为空",
  4. type: "warning"
  5. });
  6. }

8、打包加版本号和时间戳

  • vue cli3.x 没有build文件夹,所有的webpack操作在根目录的

vue.config.js中

  1. const Timestamp = new Date().getTime(); // 时间戳
  2. module.exports = {
  3. //baseUrl: './',
  4. publicPath: './', //之前用的是baseUrl,现在根据提示改为publicPath
  5. assetsDir: 'static',
  6. productionSourceMap: false,
  7. configureWebpack: { // webpack 配置
  8. output: {
  9. // 输出重构 打包编译后的 文件名称 【模块名称.版本号】
  10. filename: `static/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`,
  11. chunkFilename: `static/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`
  12. },
  13. },
  14. };

新建 .env 环境变量定义版本号

  1. VUE_APP_Version = 'v1.0'
  • vue cli2.x 是在build/webpack.prod.conf.js中设置

image.png