Vue组件解析:自定义表格组件ByTable详解

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

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

1. 组件介绍

ByTable是一个通用的Vue表格组件,用于展示数据并提供分页功能。它具有灵活的配置选项和插槽,可以满足不同场景下的表格需求。

2. 组件用法

在使用ByTable组件时,你可能需要传递以下几个属性:

  • column:表头配置数组,用于定义表格的列和相关属性。
  • showPage:是否显示分页,默认为true。
  • params:请求参数对象,用于发送网络请求时传递参数。
  • requestUrl:请求数据的接口路径,应该是一个函数。
  • isRequest:是否自动请求接口,默认为true。
  • data:传递给表格的数据数组。
  • border:是否显示表格边框,默认为true。
  • dataAttrs:自定义配置数据和总数的字段,默认为['list', 'total']。
  • page:自定义页数的字段,默认为'pageNum'。
  • total:数据总数。

除了以上属性,ByTable组件还提供了以下两个插槽:

  • slotKey:用于自定义表格单元格数据的插槽。
  • slotHeaderKey:用于自定义表头的插槽。

并且by-table支持大部分elementui中table组件的属性,如果是设置Table-column Attributes可以直接通过column这个属性中的对象进行传递,例如

[{
    prop: 'name',
    label: '姓名',
    align: 'center',
    slotKey: 'name',
    slotHeaderKey: 'nameHearder'
}]

3. 组件源代码

<template>
  <div class="by-table">
    <el-table
      v-bind="$attrs"
      v-on="$listeners"
      header-row-class-name="by-table-header"
      v-loading="loading"
      :border="border"
      :data="isRequest ? tableData : data"
    >
      <template v-for="columnItem in column">
        <!-- 序号 -->
        <el-table-column
          v-if="columnItem.type === 'index'"
          :resizable="false"
          :key="columnItem.type + 'xuhao'"
          v-bind="columnItem"
        ></el-table-column>
        <!-- 不是序号的走这里 -->
        <el-table-column
          :key="columnItem.prop"
          v-bind="columnItem"
          v-else
          :resizable="false"
        >
          <!-- 表格里面的数据 -->
          <template slot-scope="{ row }">
            <slot
              :row="row"
              v-if="columnItem.slotKey"
              :name="columnItem.slotKey"
            >
            </slot>
            <template v-else>
              {{ row[columnItem.prop] || "-" }}
            </template>
          </template>
          <!-- 自定义表头 -->
          <slot slot="header" :name="columnItem.slotHeaderKey"></slot>
        </el-table-column>
      </template>
    </el-table>
    <!-- 分页 -->
    <template v-if="showPage">
      <by-pagination
        :total=" isRequest ? tableTotal : total"
        v-model="current"
        @currentChange="currentChange"
      ></by-pagination>
    </template>
  </div>
</template>

<script>
export default {
  name: 'ByTable',
  props: {
    // 表头
    column: {
      type: Array,
      default: () => [],
    },
    // 显示分页
    showPage: {
      type: Boolean,
      default: true,
    },
    // 请求的参数
    params: {
      type: Object,
      default: () => {},
    },
    // 请求路径
    requestUrl: {
      type: Function,
      default: () => {},
    },
    // 是否自动请求接口 默认是自动请求
    isRequest: {
      type: Boolean,
      default: true,
    },
    // 传递过来的表格数据
    data: {
      type: Array,
      default: () => [],
    },
    // 是否有边框 默认是有边框的
    border: {
      type: Boolean,
      default: true,
    },
    // 自定义配置数据和总数的字段,默认是list、total
    dataAttrs: {
      type: Array,
      default: () => {
        return ['list', 'total']
      },
    },
    // 自定义页数的字段
    page: {
      type: String,
      default: 'pageNum',
    },
    // 总数
    total: {
      type: [Number, String],
      default: 0
    }
  },
  data() {
    return {
      current: 1,
      loading: false,
      tableData: [],
      tableTotal: 0,
    }
  },
  mounted() {
    // 这是自动请求接口的判断
    if (this.isRequest) {
      this.loading = true
      this.requestData()
    }
  },
  methods: {
    // 分页
    currentChange(val) {
      // 如果是配置了自动请求接口走这里
      if (this.isRequest) {
        this.params[this.page] = val
        this.requestData()
        return
      }
      // 没有就走这里
      this.$emit('currentChange', val)
    },
    // 请求数据
    requestData() {
      // pre 请求数据前做的一些处理
      this.$emit('pre')
      this.requestUrl(this.params)
        .then((res) => {
          if (res?.success) {
            // postpose请求数据后对数据做处理可以走这里,因为对象地址没有变,所以你在父组件修改了数据,by-table的数据页会跟着改变的
            this.$emit('postpose', res.data)
            this.tableData = res.data[this.dataAttrs[0]]
            this.tableTotal = res.data[this.dataAttrs[1]]
          }
        })
        .finally(() => {
          this.loading = false
        })
    },
  },
}
</script>

<style>
.by-table-header th.el-table__cell {
  background-color: #f5f5f5;
}
</style>

4. 示例代码

下面是一个示例代码,演示了如何使用ByTable组件:

<template>
  <by-table :data="tableData" :column="columnList" :isRequest="false">
    <!-- 自定义表格单元格数据插槽 -->
    <template #name="{row}">
      {{ row }}
    </template>
    <!-- 自定义表头插槽 -->
    <template #nameHeader>
      123456
    </template>
  </by-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [],
      columnList: [
        {
          prop: 'name',
          label: '姓名',
          align: 'center',
          slotKey: 'name',
          slotHeaderKey: 'nameHeader'
        },
        // 其他列配置...
      ]
    }
  }
}
</script>

在上面的示例中,我们传递了表格数据tableData和表头配置数组columnList给ByTable组件。同时,通过插槽的方式,自定义了表格单元格数据和表头的显示内容。

5. 自动请求接口和分页功能

如果需要通过接口获取数据并实现分页功能,可以使用ByTable组件提供的自动请求接口功能。通过配置requestUrlparams属性,以及自定义的数据字段和总数字段,可以轻松实现自动请求接口和分页功能。下面是相应的代码示例和解释:

<template>
  <by-table :column="columnList" :requestUrl="getUserAnalysis" :params="params" ref="byTable"></by-table>
</template>

<script>
export default {
  data() {
    return {
      columnList: [
        // 表头配置...
      ],
      params: {
        // 请求参数...
      },
      columnList: [
        {
          prop: 'name',
          label: '姓名',
          align: 'center',
          slotKey: 'name',
          slotHeaderKey: 'nameHeader'
        },
        // 其他列配置...
      ]
    }
  },
  methods: {
    getUserAnalysis(params) {
      // 这里是发送网络请求的函数,根据实际情况进行实现
      return axios.get('/api/user/analysis', { params })
    }
  },
  mounted() {
  }
}
</script>

在上面的示例中,我们传递了请求接口的函数getUserAnalysis给ByTable组件的requestUrl属性,以及请求参数params。组件会触发自动请求接口。

当分页发生变化时,ByTable组件会自动更新params中的pageNum字段,并重新请求数据。

这样,ByTable组件会自动发送网络请求,获取数据,并根据返回的数据更新表格和分页。

通过上述代码,你可以轻松实现自动请求接口和分页功能,无需手动处理数据和分页逻辑。

5. 总结

本文介绍了Vue组件ByTable的用法和属性配置,以及如何通过自动请求接口和分页功能实现数据的获取和展示。通过合理配置表头、插槽和相关属性,你可以根据具体需求创建灵活的表格组件。

下一篇:Vue组件解析:自定义弹窗组件ByDialog详解文章来源地址https://www.toymoban.com/news/detail-496820.html

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

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

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

相关文章

  • 如何使用Vue实现Excel表格数据的导入,在前端实现Excel表格文件的上传和解析,并使用Table组件将解析出来的数据展示在前端页面上

    随着互联网的发展和社会的进步,各个行业的数据量越来越大,对于数据的处理变得越来越重要。其中,Excel表格是一种重要的数据处理工具。在前后端项目中,实现Excel表格的导入和导出功能也愈加常见。这篇文章将介绍如何使用Vue实现Excel表格数据的导入。 在开始介绍实现

    2024年02月11日
    浏览(34)
  • 基于vue和element-ui的表格组件,主推数据渲染,支持内容和方法灵活绑定,提供动态具名插槽自定义内容

            组件名为commonTable,主要是基于element-ui中的表格组件进行二次封装的组件,集成了常用的表格功能,除默认内容的显示外,还包括以下几点:         1. 状态的筛选和显示;         2. 操作按钮的显示和方法绑定;         3. 自定义具名插槽内容的封装;      

    2024年02月07日
    浏览(43)
  • 封装自定义表格组件

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

    2024年02月09日
    浏览(30)
  • Vue组件库Element-常见组件-表格

    对于Element组件的使用,最主要的就是明确自己想要达到的效果,从官网中将对应代码复制粘贴即可,最重要的是要 读懂不同组件官网中提供的 文档 ,以便实现自己想要的效果 常见组件-表格 Table:表格:用于展示多条结构类似的数据,可以对数据进行排序、筛选、对比或其

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

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

    2024年02月12日
    浏览(45)
  • Vue前端的一些表格组件的思考

    当我们需要在前端中展示一些表格内容时,我们往往使用 Vue 的 table 来实现 当前实现如下: Vue Easytable 是一个基于Vue2的表格组件,支持单元格合并、单元格编辑、多表头固定、多列固定、列拖动、排序、自定义列、分页、单元格编辑、多选、条件过滤、footer 汇总等功能。

    2024年02月11日
    浏览(29)
  • 一个功能强大、好看的vue表格组件

    今天给大家推荐一个好用、强大的Vue表格扩展组件。 这是支持Vue 3/Vue 2的一个表格组件,支持表格增删改、虚拟表格、复杂表格、树形表格、数据校验、懒加载、分页、弹窗、单元格样式设置、按钮自定义样式、表头样式、单元格合等功能。 组件兼容各大浏览器、高效整洁的

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

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

    2024年02月20日
    浏览(32)
  • vue2组件库:表格数据展示通用页面

    2024年02月11日
    浏览(26)
  • 基于vue+element ui实现下拉表格选择组件

    根据https://lolicode.gitee.io/scui-doc/demo/#/dashboard里的组件修改

    2024年02月16日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包