关于vue.js:Vue2管理系统一键配置crud提升效率300

4次阅读

共计 8773 个字符,预计需要花费 22 分钟才能阅读完成。

本文次要基于 element-ui 深度封装,旨在疾速实现列表查问、增删改查、弹窗表单。能够看到上面残缺示例中蕴含了 Vue2 后盾管理系统中日常基本功能,代码量却非常少,可复用性十分高,6 点上班美滋滋。

github 地址 不断更新保护,如果对你有帮忙,帮忙加个 star~

一、残缺示例

蕴含列表 table、分页、搜寻条件查问、新增、编辑、删除

<mx-crud
      :data="tableList"
      :option="listOption"
      :page="page"
      :table-loading="loading"
      @size-change="sizeChange"
      @current-change="currentChange"
      @search-change="searchChange"
      @row-save="addFun"
      @row-update="updateFun"
      @row-del="rowDel"
      @custom-add="rowCustomAdd"
      @custom-view="rowCustomView"
      @custom-edit="rowCustomEdit"
      @search-reset="resetList">
      <template v-slot:zdy="{row}">
        {{row.id}}
      </template>
      <template v-slot:menu="{row}"> menu 插槽{{row}} </template>
</mx-crud>
listOption() {
      return {
        isShowmenu: true, // 操作栏配置 - 是否显示操作栏
        isViewBtn: true, // 操作栏配置 - 是否显示查看
        isEditBtn: true, // 操作栏配置 - 是否显示编辑
        isDelBtn: true, // 操作栏配置 - 是否显示删除
        exportBtn: true, // 操作栏配置 - 导出
        exportRecordBtn: true, // 操作栏配置 - 导出记录
        align: "center", // 表格列配置 - 对齐形式
        index: true, // 表格列配置 - 索引
        customAdd: false, // 自定义新增
        customView: true, // 自定义查看
        customEdit: false, // 自定义编辑
        titleAliasEdit: "自定义 title",
        column: [
          {
            label: "姓名 1",
            labelAlias: "自定义 label 别名", // 弹窗表单配置 - 自定义 label 别名
            prop: "name",
            search: true, // 表格列配置 - 是否搜寻
            width: 200, // 表格列配置 - 宽度
            rules: {
              required: true,
              message: "请输出",
              trigger: ["blur", "change"],
            },
          },
          {
            label: "自定义列",
            prop: "zdy",
            slot: true, // 表格列配置 - 自定义列
            viewDisplay: false, // 弹窗表单配置 - 查看是否显示
            editDisplay: false, // 弹窗表单配置 - 编辑是否显示
            addDisplay: false, // 弹窗表单配置 - 新增是否显示
          },
          {
            label: "多选框",
            prop: "selectType",
            // multiple: true,
            search: true,
            type: "select", // 搜寻 - 定义类型
            rules: {
              required: true,
              message: "请抉择",
              trigger: ["blur", "change"],
            },
            dicData: [
              {
                label: "紧急布告",
                value: 1,
              },
              {
                label: "上线布告",
                value: 2,
              },
              {
                label: "业务布告",
                value: 3,
              },
            ],
            formatter: (row) => {
              // 表格列配置 - 筛选
              const map = new Map([[1, ` 紧急布告 `],
                [2, ` 上线布告 `],
                [3, ` 业务布告 `],
              ]);
              return map.get(row.selectType);
            },
          },
          {
            label: "工夫",
            prop: "date",
            search: true,
            type: "date", // 搜寻 - 定义类型
            format: "yyyy-MM-dd",
            valueFormat: "yyyy-MM-dd",
            rules: {
              required: true,
              message: "请抉择",
              trigger: ["blur", "change"],
            },
          },
          {
            label: "状态 formatter",
            prop: "status",
            viewDisplay: false, // 弹窗表单配置 - 查看是否显示
            editDisplay: false, // 弹窗表单配置 - 编辑是否显示
            addDisplay: false, // 弹窗表单配置 - 新增是否显示
            formatter: (row) => {
              // 表格列配置 - 筛选
              const map = new Map([[1, `<i class="class1"></i> 未开始 `],
                [2, `<i class="class2"></i> 胜利 `],
                [3, `<i class="class3"></i> 已实现 `],
              ]);
              return map.get(row.status);
            },
          },
          {
            label: "列暗藏",
            prop: "lyc",
            viewDisplay: false, // 弹窗表单配置 - 查看是否显示
            editDisplay: false, // 弹窗表单配置 - 编辑是否显示
            addDisplay: false, // 弹窗表单配置 - 新增是否显示
            hide: true, // 表格列配置 - 列暗藏
          },
          {
            label: "日期 2",
            prop: "date2",
            hide: true,
            viewDisplay: false, // 弹窗表单配置 - 查看是否显示
            editDisplay: false, // 弹窗表单配置 - 编辑是否显示
            addDisplay: false, // 弹窗表单配置 - 新增是否显示
            align: "left", // 表格列配置 - 对齐形式
          },
          {
            label: "地址 3",
            prop: "address",
            overHidden: true, // 表格列配置 - 内容超出暗藏
            width: 100, // 表格列配置 - 宽度
            rules: {
              required: true,
              message: "请输出",
              trigger: ["blur", "change"],
            },
          },
        ],
      };
    },

详情示例

二、属性办法介绍

这些属性办法应用频率较高,办法和属性都是在组件里抛出,当咱们须要某些性能和配置
时,增加即可

Crud

参数 说 明 类型 默认值
data 列表数据 array
option 表单配置项 参考 Option 配置 object
page 分页变量 参考 Page 参数 object
table-loading 表格 loading boolean boolean

Option

参数 说 明 类型 默认值
index 是否有序号 boolean
align 列表对齐形式 string ‘center’
isShowmenu 是否显示操作栏 boolean false
isViewBtn 是否显示查看按钮 boolean false
isEditBtn 是否显示编辑按钮 boolean false
isDelBtn 是否显示删除按钮 boolean false
exportBtn 是否显示导出按钮 boolean
exportRecordBtn 是否显示导出记录按钮 boolean
customAdd 是否自定义新增回调 boolean
customView 是否自定义查看回调 boolean
customEdit 是否自定义编辑回调 boolean
titleAliasEdit 自定义新增编辑弹窗 title string

Column 属性

参数 说 明 类型 默认值
label 列题目 string
prop 列题目对应字段 string
width 对应列的宽度 string
search 是否为搜寻项 Boolean
rules 弹窗表单校验规定 object
hide 列表项是否显示 Boolean false
addDisplay 表单新增时项是否显示 Boolean
editDisplay 表单编辑时项是否显示 Boolean
viewDisplay 表单查看时项是否显示 Boolean
formatter 用来格式化列内容 function
dicData 数据字典值 array

Events

| 事件名称 | 说 明 | 类型 |
| ————————- | ———————————————————————– | ————— |
| size-change | pageSize 扭转时会触发 | 每页条数 |
| current-change | currentPage 扭转时会触发 | 当前页 |
| search-change | 点击搜寻触发该事件 | |
| search-reset | 点击重置触发该事件 | |
| row-save | 新增数据确定触发该事件 | |
| row-update | 更新数据确定触发该事件 | |
| row-del | 行数据删除时触发该事件 | |
| custom-add | 自定义新增触发该事件 | |
| custom-edit | 自定义编辑触发该事件 | |
| custom-view | 自定义查看触发该事件 | |

三、搜寻 & 分页

管制 column 是否搜寻

search 变量管制列表项是否搜寻

listOption:{
    column: [{
        label: '姓名',
        prop: 'name',
        search:true, // 管制 column 是否搜寻
    }]
}

搜寻办法

search-change: 点击搜寻触发该事件 search-reset: 点击重置触发该事件

<mx-crud
    :data="tableList"
    :option="listOption"
    :page="page"
    :table-loading="loading"
    @search-change="searchChange"
    @search-reset="resetList">
</mx-crud>

自定义列搜寻

配置 searchslot 为 true 即可开启自定义,列的 prop 加 Search 作为卡槽的名称

<mx-crud :option="listOption" :data="tableList" >
     <!-- 搜寻 自定义 slot -->
      <template v-slot:ageSearch="{column}"> {{column.prop}} </template>
</mx-crud>

listOption:{
    column: [{
        label: "自定义列搜寻",
        prop: "age",
        search: true,
        searchslot: true,
    }]
}

页码和条数

currentPage 以后页码,total 总条数,pageSize 每页多少条数据

四、操作栏设置 & 表格列配置

操作栏暗藏 & 其余属性

isShowmenu 属性承受一个 Boolean 属性显示暗藏操作栏,默认为 false
menuWidth 属性设置操作栏宽度

自定义操作栏

menu 为操作栏自定义

<!-- 操作栏配置 - 自定义操作栏 -->
<template #menu="{row}"> menu 插槽 {{row.name}}</template>

操作栏查看、编辑、删除按钮设置

isViewBtn 是否显示查看按钮, 默认 false;
isEditBtn 是否显示编辑按钮, 默认 false;
isDelBtn 是否显示删除按钮, 默认 false;

列配置暗藏 & 其余属性

hide 属性承受一个 Boolean 属性显示暗藏表格列,默认为 false
width 属性管制每列的宽度
align 属性管制每列的对齐形式
overHidden 设置 true 超出列表宽度内容以省略号显示

自定义列

设置列的属性 slot 为 true 时,在卡槽中用 prop 作为卡槽的名字即可

<template v-slot:zdy="{row}">
    {{row.prop}}
</template>
{
  label: "自定义列",
  prop: "zdy",
  slot: true, // 表格列配置 - 自定义列
},

列内容格式化

formatter 办法格式化内容

{
label: "状态 formatter",
prop: "status",
formatter: (row) => {
    const map = new Map([[1, `<i class="class1"></i> 未开始 `],
    [2, `<i class="class2"></i> 胜利 `],
    [3, `<i class="class3"></i> 已实现 `],
     ]);
    return map.get(row.status);
 }
}

五、顶部按钮 & 自定义回调

顶部按钮管制

addBtn 属性设置是否显示新增按钮, 默认 true;
利用了 menuLeft 卡槽自定义顶部按钮

自定义回调

customAdd 自定义新增回调

<mx-crud
  ref="crud"
  :data="tableList"
  :option="listOption"
  @custom-add="rowCustomAdd">
</mx-crud>
listOption() {
  return {customAdd: true, // 自定义新增回调}
}

未设置时,默认关上新增弹窗表单;设置 customAdd 为 ture 时, 减少 custom-add 回调, 减少自定义解决。

customEdit 自定义编辑回调

<mx-crud
  ref="crud"
  :data="tableList"
  :option="listOption"
  @custom-edit="rowCustomEdit">
</mx-crud>
listOption() {
  return {customEdit: true, // 自定义编辑回调}
}

未设置时,默认关上编辑弹窗表单;设置 customEdit 为 ture 时, 减少 custom-edit 回调, 减少自定义解决。

customView 自定义查看回调

<mx-crud
  ref="crud"
  :data="tableList"
  :option="listOption"
  @custom-view="rowCustomView">
</mx-crud>
listOption() {
  return {customView: true, // 自定义查看回调}
}

未设置时,默认关上新增弹窗;设置 customView 为 ture 时, 减少 custom-view 回调, 减少自定义解决。

六、提取 Mixins & 增删改查封装

公共 Mixins

提取公共 Mixins, 缩小各个业务页面反复代码,蕴含 page、tableList、loading 属性,sizeChange、currentChange、增删改查办法等。自此业务开发时,只须要配置对应的 option,及 crud 接口即可实现根本业务开发,效率晋升杠杠的,反复低质的工作大幅度较少。

配置接口 & 增删改查封装

crud 逻辑绝对固定,抽取到 mixin 做相应封装解决。业务页面配置接口,mixin 中调用

  mixins: [mixin],
  data() {
    return {
      COM_HTTP: {  // 配置接口
        reqList: queryHomePageData, // 列表查问
        reqDel: deleteHomePageData, // 删除
        reqAdd: addHomePageData, // 新增
        reqUpdate: updateHomePageData, // 编辑
      }
    }
  }

残缺 mixins

详情

export default {data() {
    return {COM_HTTP: {}, // 以后默认申请
      tableList: [], // 表格列表数据
      loading: false, // 加载管制
      page: {
        currentPage: 1,
        pageSize: 10,
        total: 0,
      },
    };
  },
  mounted() {this.searchFun();
  },
  methods: {
    // 抉择分页条数
    sizeChange(val) {
      this.page.currentPage = 1;
      this.page.pageSize = val;
      this.searchFun();},
    // 跳转页码
    currentChange(val) {
      this.page.currentPage = val;
      this.searchFun();},
    // 触发按钮查问
    searchChange(params) {this.searchFun(params, 1);
    },
    /** 查询方法 */
    async searchFun(params, currentPage) {
      this.loading = true;
      // 传入参数有 current
      if (currentPage) {this.page.currentPage = currentPage;}
      const filnalParams = this.searchFunParamsHandle(params);
      console.log('最初的申请参数 filnalParams:', filnalParams);
      const {data: res} = await this.COM_HTTP.reqList(filnalParams);
      // 没做 axios 数据拦挡 多一层构造
      if (res.code === RESPONSE_CODE.SUCCESS) {this.tableList = res.data.results || [];
        this.page.total = res.data.total || 0;
        this.page.currentPage = res.data.currentPage || 1;
      } else {this.$message.error(res.msg);
      }
      this.loading = false;
    },
    /** 列表查问参数解决 */
    searchFunParamsHandle(params) {
      let filnalParams = Object.assign({ page: this.page.currentPage, pageSize: this.page.pageSize},
        params
      );
      return filnalParams;
    },
    // 删除 - 提醒弹窗
    rowDel(row, index) {
      const delTipMsg =
        this.customDelMsg || this.delTipMsg || '确定删除该条数据?';
      this.$confirm(delTipMsg, '提醒', {
        confirmButtonText: '确定',
        cancelButtonText: '勾销',
        closeOnClickModal: false,
        type: 'warning',
      })
        .then(() => {
          // 开始删除
          this.deleteFun(row, index);
        })
        .catch(() => {});
    },
    /**
     * 减少办法
     * @param {*} item  新增数据
     * @param {*} doneCallback  执行实现回调
     */
    async addFun(item, doneCallback){const { data: res} = await this.COM_HTTP.reqAdd(item)
      // 没做 axios 数据拦挡 多一层构造
        if (res.code === RESPONSE_CODE.SUCCESS) {this.$message.success('新增胜利')
            this.searchFun()
            doneCallback()} else {this.$message.error(res.msg);
        }
    },
    /**
     * 编辑更新办法
     * @param {*} item  新增数据
     * @param {*} doneCallback  执行实现回调
     */
    async updateFun(item, doneCallback){const { data: res} = await this.COM_HTTP.reqUpdate(item)
      // 没做 axios 数据拦挡 多一层构造
        if (res.code === RESPONSE_CODE.SUCCESS) {this.$message.success('新增胜利')
            this.searchFun()
            doneCallback()} else {this.$message.error(res.msg);
        }
    },
    // 删除办法
    async deleteFun(item) {
      // 调接口
      const {data: res} = await this.COM_HTTP.reqDel(item)
       // 没做 axios 数据拦挡 多一层构造
      if (res.code === RESPONSE_CODE.SUCCESS) {this.$message.success('删除胜利')
      } else {this.$message.error(res.msg);
      }
   
    },
    // 搜寻清空
    resetList() {console.log('resetList');
    },
  },
};

七、其余性能 & 后续

整个根本查问、列表、分页增删改查已根本实现。当然性能没有八面玲珑,如很多 table 的属性配置和办法,到组件源码中减少对应的配置即可
如需请留言我会补上你所需的性能场景。后续:逐步完善性能,如果有人看,持续封装一个 Vue3 版本。

引入办法

初步公布了一个 npm 包,大家可下载应用,更倡议下载整个我的项目,联合示例看懂源码

// 组件库
import mxCrud from "mx-crud";
import 'mx-crud/lib/mx-crud.css';
// 调试或者自定义 crud
// import mxCrud from "../packages/src/index";

八、最初

我更举荐的是屏幕前的你看懂封装的思路,几年前的我首次应用和浏览时,直呼 666,算是小开了眼界;整个代码量不是很大,逻辑也比较简单,一两把游戏的工夫足已;看懂之后减少日常业务开发需要的性能,信手拈来。将整体齐全消化吸收,逐渐拓展成公司组件库,妥妥的 KPI,进步整体前端的开发效率。

github 地址 不断更新保护,如果对你有帮忙,帮忙加个 star~

正文完
 0