当前位置:   article > 正文

el-table二次封装表格组件

el-table二次封装

在日常开发后端管理系统项目中,用于展示数据多会用表格进行展示,这样我们可以把相同的部分处理出来,二次封装一个基于elementUI中的el-table封装一个简单的表格组件,进行多页面的数据展示的复用。

首先第一步肯定要引入elementUI组件库,我们可以使用全局引入和局部引入两种的方式

elementUI具体使用方法可以参考elementUI官网:

Element - The world's most popular Vue UI framework

这边个人推荐使用局部引入,这样可以减少项目的体积

引入之后,接下来我们就可以进行表格的二次封装了:

子组件template部分:

  1. <!-- 表格组件 -->
  2. <template>
  3. <el-table
  4. :data="data"
  5. style="width: 100%"
  6. highlight-current-row
  7. @selection-change="handleSelectionChange">
  8. <el-table-column
  9. v-if="showSelect"
  10. type="selection"
  11. width="55"
  12. align="center">
  13. <!-- //TODO showSelect:表格组件是否带多选框类型:带或不带 -->
  14. </el-table-column>
  15. <el-table-column
  16. align="center"
  17. v-for="item in columns"
  18. :key="item.prop"
  19. :prop="item.prop"
  20. :label="item.label"
  21. :width="item.width"
  22. :formatter="item.formatter">
  23. </el-table-column>
  24. <el-table-column v-if="showStatus" label="状态" align="center">
  25. <!-- // TODO showStatus:是否带状态开关 -->
  26. <template slot-scope="scope">
  27. <el-switch
  28. v-model="scope.row.status"
  29. active-value="0"
  30. inactive-value="1"
  31. @change="handleStatusChange(scope.row)">
  32. </el-switch>
  33. </template>
  34. </el-table-column>
  35. <el-table-column
  36. v-if="showHandle"
  37. fixed="right"
  38. label="操作"
  39. width="150"
  40. align="center">
  41. <!-- //TODO showHandle:是否带操作栏 -->
  42. <template slot-scope="scope">
  43. <slot :item="scope.row"></slot>
  44. </template>
  45. </el-table-column>
  46. </el-table>
  47. </template>

template部分的复选框、状态改变、操作栏使用v-if判断是否显示,父组件传入Boolean值选择是否需要,使用示例请看父组件template部分

一般表格会需要操作栏,那么我们使用插槽在子组件中对操作栏进行自定义,父组件中使用插槽添加自己想要的按钮,例子见代码中详情按钮

有时候会需要使用formatter解析表格中的部分参数(对时间进行处理、钱加$符号、后端返回状态对它进行展示),需要在子组件中定义formatter方法,让它使用父组件中传入的formatter函数即可,具体可看父组件data中的tableColumns

子组件script部分:

  1. <script>
  2. export default {
  3. props: {
  4. data: {
  5. type: Array,
  6. required: true,
  7. },
  8. columns: {
  9. type: Array,
  10. required: true,
  11. },
  12. showSelect: {
  13. type: Boolean,
  14. default: false,
  15. },
  16. showHandle: {
  17. type: Boolean,
  18. default: false,
  19. },
  20. showStatus: {
  21. type: Boolean,
  22. defalut: false,
  23. },
  24. },
  25. methods: {
  26. // 多选框
  27. handleSelectionChange(val) {
  28. this.multipleSelection = val;
  29. this.$emit("selectionData", val);
  30. },
  31. // 状态开关
  32. handleStatusChange(row) {
  33. let text = row.status === "0" ? "启用" : "停用";
  34. this.$confirm('确认要"' + text + '"吗?', "警告", {
  35. confirmButtonText: "确定",
  36. cancelButtonText: "取消",
  37. type: "warning",
  38. })
  39. .then(() => {
  40. this.msgSuccess(text + "成功");
  41. // console.log(row);
  42. this.$emit("statusData", row);
  43. })
  44. .catch(function () {
  45. row.status = row.status === "0" ? "1" : "0";
  46. });
  47. },
  48. },
  49. };
  50. </script>

子组件在data中规定父组件传递给子组件数据的类型,默认值等

子组件添加一些基础方法,把值传递给父组件,例如点击多选框后,触发子组件中复选框方法,利用$emit子传父自定义方法名,把选中数据传递给父组件,父组件中调用 @selectionData="getData"

父组件template部分:

  1. <template>
  2. <div class="app-container">
  3. <el-page-header content="详情页面"></el-page-header>
  4. <Table
  5. :data="tableData"
  6. :columns="tableColumns"
  7. showSelect
  8. showHandle
  9. showStatus
  10. v-loading="loading"
  11. @selectionData="getData">
  12. <template slot-scope="{ item }">
  13. <el-button @click="handleTableClick(item)" type="text" size="small">
  14. 详情
  15. </el-button>
  16. </template>
  17. </Table>
  18. </div>
  19. </template>

父组件sccript部分:

  1. <script>
  2. import * as Apis from "@/api/comparison/result/index";
  3. import Table from "@/components/DataTable/index"; // 引入组件
  4. import { dateFormat } from "@/utils/index"; // 时间处理函数
  5. export default {
  6. components: { // 使用子组件
  7. Table: Table,
  8. },
  9. data() {
  10. return {
  11. queryParams: {
  12. id: null,
  13. customerNo: "", // 客户编号
  14. contrastResult: "", // 客户状态查询
  15. outOrderNos: [], // 订单号
  16. trackNumbers: [], // 运单号
  17. },
  18. // 加载中遮罩层
  19. loading: false,
  20. tableData: [],
  21. tableColumns: [
  22. { prop: "customerNo", label: "客户编号", width: "150" },
  23. { prop: "outOrderNo", label: "客户订单号" },
  24. { prop: "trackNumber", label: "运单号" },
  25. {
  26. prop: "priceTotal",
  27. label: "总计",
  28. width: "100",
  29. formatter: function (row, column, cellValue, index) {
  30. if (row.priceTotal) {
  31. return `$${row.priceTotal}`;
  32. }
  33. },
  34. },
  35. { prop: "importTime", label: "时间", formatter: dateFormat },
  36. {
  37. prop: "contrastResult",
  38. label: "状态",
  39. formatter: function (row, column, cellValue, index) {
  40. switch (row.contrastResult) {
  41. case 0:
  42. return "已打印";
  43. case 1:
  44. return "未打印";
  45. case -1:
  46. return "运输中";
  47. case -2:
  48. return "已取消";
  49. default:
  50. break;
  51. }
  52. },
  53. },
  54. ],
  55. ],
  56. };
  57. },
  58. methods: {
  59. getData(val){
  60. console.log(val,'子组件传递过来selection选中的数据');
  61. },
  62. async getList() {
  63. this.loading = true;
  64. const data = await Apis.contrastDetail(this.queryParams);
  65. console.log(data);
  66. this.loading = false;
  67. this.total = data.total;
  68. this.tableData = data.rows;
  69. },
  70. // 详情按钮
  71. handleTableClick(row) {
  72. console.log(row, "当前点击行中的数据");
  73. },
  74. },
  75. created() {
  76. this.getList()
  77. },
  78. };
  79. </script>

在父组件data中tableColumns传入formatter方法,就可以对部分数据进行解析、处理。

以上就是基于el-table做的一个简单地二次封装,可以满足基础表格的使用,建议收藏文章,后续会继续完善,更加完美!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/621592
推荐阅读
相关标签
  

闽ICP备14008679号