封装自定义表格组件

这篇具有很好参考价值的文章主要介绍了封装自定义表格组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

技术栈: vue2.0 +js +webpack
需求: 封装数据渲染的动态表格组件
1.实现字典表的转译
2.排序号的自动编译
3.自定义字段
4.操作栏的自定义

封装组件代码:

<template>
  <el-table
    v-loading.fullscreen.lock="loading"
    ref="multipleTable"
    :data="list"
    v-bind="$attrs"
    :header-cell-style="{ background: '#eceef4' }"
    @sort-change="sortChange"
    :border="true"
    :stripe="true"
    class="eltabbox"
    :height="'100%'"
    :row-class-name="tableRowClassName"
    element-loading-background="rgba(0, 0, 0, 0.4)"
    element-loading-text="Loading"
  >
    <template slot="empty">
      <EmptyData />
    </template>
    <el-table-column
      :key="Math.random()"
      v-if="showIndex"
      width="80"
      :align="'center'"
      label="排序号"
      fixed="left"
    >
      <template slot-scope="scope">
        <span class="column-index">{{ scope.row.tempIndex + 1 }}</span>
      </template>
    </el-table-column>
    <el-table-column
      v-for="column in normalColumns"
      :key="Math.random()"
      :prop="column.prop"
      :label="column.label"
      :align="column.align"
      :width="column.width"
      :sortable="sortFun(column.prop)"
      :sort-orders="['descending', 'ascending', null]"
    >
      <template #default="scope">
        <!-- 自定义字段-->
        <template v-if="column.html">
          <div v-html="column.html(scope.row, column)"></div>
        </template>
        <!--字典转换--->
        <template v-else-if="column.dictionary">
          <span>
            {{ changeDict(column.dictionary, scope.row[column.prop]) }}
          </span>
        </template>
        <span v-else>{{ scope.row[column.prop] }}</span>
      </template>
    </el-table-column>
    <el-table-column label="操作" v-if="showAction" :key="Math.random()">
      <template #default="scope">
        <slot v-bind="scope" name="actionSlot"></slot>
      </template>
    </el-table-column>
  </el-table>
</template>
<script>
//表格的整体高度为100% 需要在最外一层进行高度的给定
import EmptyData from "@/components/EmptyData";
export default {
  name: "BaseTable",
  components: {
    EmptyData
  },
  props: {
    // 数据列表
    list: {
      type: Array,
      default: () => []
    },
    // 需要展示的列 === prop:列数据对应的属性,label:列名,align:对齐方式,width:列宽
    columns: {
      type: Array,
      default: () => []
    },
    sortList: {
      // 需要开启排序的列
      type: Array,
      default: () => {
        return [];
      }
    },
    showAction: {
      type: Boolean,
      default: false
    },
    showIndex: {
      //是否显示排序号
      type: Boolean,
      default: false
    },
    //加载
    loading: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      normalColumns: this.columns.filter(item => !item.type),
      sortType: {
        ascending: "asc",
        descending: "desc"
      }
    };
  },
  methods: {
    sortChange(column) {
      let order = sortType[column.order];
      const sortParam = order
        ? { sort_key: column.prop, sort_order: order }
        : {};
      console.log("---sortParam----", sortParam);
      this.$emit("sortChange", sortParam);
    },
    sortFun(val) {
      const temp = this.sortList.find(item => {
        return item === val;
      });
      return temp ? "custom" : false;
    },

    //字典转译
    changeDict(arr, val) {
      const list = arr.find(item => item.code === val);
      return list.name || "-";
    },
    tableRowClassName(row, index) {
      // 给每条数据添加一个索引
      row.row.tempIndex = row.rowIndex;
    }
  }
};
</script>

组件的使用:

<template>
  <div class="base-table">
    自定义表格的封装 + 页签组件 + 操作栏
    <BaseTable :columns="columns" :list="tableData" :showAction="true">
      <template #actionSlot="scope">
        <el-button>编辑 / 删除{{ scope.row }}</el-button>
      </template>
    </BaseTable>
  </div>
</template>
<script>
import BaseTable from "@/components/BaseTable";
import { columns, tableData } from "./data";
export default {
  components: {
    BaseTable
  },
  data() {
    return {
      columns,
      tableData,
      total: 30,
      queryParams: {
        pageNo: 1,
        pageSize: 30
      }
    };
  },
  methods: {
    getList() {
      console.log("请求数据", this.queryParams);
    }
  }
};
</script>
<style lang="scss" scoped>
.base-table {
  height: 500px;
  margin-bottom: 100px;
}
</style>

数据:文章来源地址https://www.toymoban.com/news/detail-697723.html

export const columns = [{
    prop: 'text',
    label: '名称',
  },
  {
    prop: 'current',
    label: '本期',
  },
  {
    prop: 'previous',
    label: '上月同期',
  },
  {
    prop: 'lastCurrent',
    label: '去年同期',
  },
  {
    prop: 'currentRatio',
    label: '环比(%)',
    html: (row) => {
      return row.currentRatio < 0 ? `<span style="color: red;">${row.currentRatio}</span>` : row.currentRatio;
    },
  }, {
    prop: 'lastCurrentRatio',
    label: '同比(%)',
    html: (row) => {
      return row.lastCurrentRatio < 0 ? `<span style="color: red;">${row.lastCurrentRatio}</span>` : row.lastCurrentRatio;
    },
  },
]


export const tableData = [{
  text: 11,
  current: 11,
  previous: 'nini',
  lastCurrent: 22,
  currentRatio: 52525,
  lastCurrentRatio: -555
}]

到了这里,关于封装自定义表格组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于VUE3+Layui从头搭建通用后台管理系统(前端篇)八:自定义组件封装上

      本章实现一些自定义组件的封装,包括数据字典组件的封装、下拉列表组件封装、复选框单选框组件封装、单选框组件封装、文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载

    2024年02月12日
    浏览(36)
  • vue封装table组件---万能表格!

    vue封装table—万能表格! 先看效果图 搜索条件-按钮都有的哦!拿来即用,不用谢,哈哈 代码如下: 因为有render参数,所以组件需引入table.js,代码如下:

    2024年02月12日
    浏览(46)
  • vue封装el-table表格组件

    先上效果图: 本文包含了具名插槽、作用域插槽、jsx语法三种: Render.vue( 很重要,必须有 ): Table.vue 使用Table组件

    2024年02月20日
    浏览(32)
  • element ui 表格组件与分页组件的二次封装

    目录 效果图  组件封装  parseTime函数 debounce 函数 render通用渲染模版 页面使用 【扩展】vue 函数式组件 函数式组件特点: 函数式组件的优点: 【扩展】vue中的render函数 一、初步认识render函数 二、为什么使用render函数 三、render函数的解析 【扩展】添加操作栏显示权限 结构

    2024年02月08日
    浏览(34)
  • Vue3 + Element Plus 封装公共表格组件(带源码)

    由于项目中有很多菜单都是列表数据的展示,为避免太多重复代码,故将 Element Plus 的 Table 表格进行封装,实现通过配置展示列表数据 支持自动获取表格数据 支持数据列配置及插槽 支持操作列配置及插槽 支持多选框配置 支持表尾配置及插槽 支持分页显示 3.1 复制基本表格

    2024年02月08日
    浏览(68)
  • 【分页表格】Vue2 + Element UI实现自定义的分页表格组件(自定义Vue组件)

    这篇文章,主要介绍Vue2 + Element UI实现自定义的分页表格组件(自定义Vue组件)。 目录 一、分页表格 1.1、运行效果 1.2、运行环境 1.3、案例代码

    2024年02月11日
    浏览(46)
  • element ui 表格组件与分页组件的二次封装 【扩展】vue中的render函数

    目录 效果图  组件封装  parseTime函数 debounce 函数 render通用渲染模版 页面使用 【扩展】vue 函数式组件 函数式组件特点: 函数式组件的优点: 【扩展】vue中的render函数 一、初步认识render函数 二、为什么使用render函数 三、render函数的解析 【扩展】添加操作栏显示权限 结构

    2024年02月09日
    浏览(49)
  • vue中element-ui表格组件el-table封装,在table表格中插入图片

            这次写的项目是写后台管理系统这部分,对于后台管理使用vue写,用组件的话,table组件用得次数比较多,可以封装一个table组件。         1.如封装的table组件:  :prop=\\\"item.prop\\\"  :label=\\\"item.label\\\"是必须要有的,其他的可以根据自己需要写 。 2.封装之后是就是使

    2024年02月15日
    浏览(41)
  • Vue组件解析:自定义表格组件ByTable详解

    【简介】:本文将介绍一个基于Vue框架和elementUi的自定义表格组件ByTable,通过阅读本文,你将了解到ByTable组件的使用方式、属性和插槽的配置方法,以及如何通过自动请求接口获取表格数据和实现分页功能。 ByTable是一个通用的Vue表格组件,用于展示数据并提供分页功能。它

    2024年02月10日
    浏览(29)
  • 封装Select组件自定义输入个数

    使用方式 tagRef.current.value 拿到select数据,maxInputSize输入最大tag数量 组件

    2024年02月12日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包