环境:vue2.6
1. 安装xe-utils vxe-table

npm install xe-utils vxe-table

注: xe-utils是vxe-table的依赖环境,需要一并安装。

2.添加main.js
	  import Vue from 'vue'
      import VXETable from 'vxe-table'
      import 'vxe-table/lib/index.css'

      Vue.use(VXETable)

注: 部分人安装时可能会出现像下图这样的阴影情况,这里没事,请不要删除。
在这里插入图片描述

3.构筑vxe-table组件

创建如下图目录:在components包下创建hxlh-table包,然后在创建hxlh-table.vue文件。

在这里插入图片描述
hxlh-table.vue文件的内容:

<template xmlns:v-slot="http://www.w3.org/1999/XSL/Transform">
  <div class="hxlh-table">
    <vxe-grid
      ref="vxeTable"
      :show-header-overflow="true"
      :show-overflow="showOverflow"
      :stripe="true"
      :border="true"
      :show-footer="showfooter"
      header-align="center"
      highlight-hover-column
      highlight-hover-row
      resizable
      :loading="loading"
      :pager-config="tablePage"
      :form-config="tableForm"
      :columns="columns"
      :data.sync="data"
      :checkbox-config="checkboxConfig"
      :height="height"
      :max-height="maxHeight"
      :toolbar="toolbar"
      :reload-data="reloadData"
      :footer-method="footerMethod"
      :footer-cell-class-name="footerCellClassName"
      @sort-change="sortChange"
      @page-change="pagerChange"
      @form-submit="findList"
      @checkbox-change="checkChange"
      @checkbox-all="checkChangeall"
    >
      <template v-slot:buttons>
        <slot />
      </template>
    </vxe-grid>
  </div>
</template>

<script>

export default {
  name: 'HxlhTable',
  props: {
    /* table 参数*/
    showOverflow: {
      type: Boolean,
      default: () => {
        return true
      }
    },
    columns: {
      type: Array,
      default: () => {
        return []
      }
    },
    showfooter: {
      type: Boolean,
      default: () => {
        return false
      }
    },
    toolbar: {
      type: Object,
      default: () => {
        return {
          id: 'khjgz',
          zoom: true,
          resizable: {
            storage: true
          },
          custom: {
            storage: true
          },
          slots: {
            buttons: 'buttons'
          }
        }
      }
    },
    data: {
      type: Array,
      default: () => {
        return []
      }
    },
    loading: {
      type: Boolean,
      default: false
    },
    page: {
      type: Object,
      default: function() {
        return null
      }
    },
    checkboxConfig: {
      type: Object,
      default: () => {
        return {}
      }
    },
    maxHeight: {
      type: String,
      default: () => {
        return ''
      }
    },
    height: {
      type: String,
      default: () => {
        return ''
      }
    },
    reloadData: {
      type: Function,
      default: () => {
        return {}
      }
    },
    footerCellClassName: {
      type: Function,
      default: () => {
        return {}
      }
    },
    mxTableFootData: {
      type: Array,
      default: () => {
        return []
      }
    }
  },
  data() {
    return {
      tableForm: {}
    }
  },
  computed: {
    tablePage() {
      if (!this.page) {
        return
      }
      return {
        total: this.page.total,
        currentPage: this.page.current,
        pageSize: this.page.size,
        align: 'left',
        pageSizes: [10, 20, 50, 100, 500],
        layouts: ['PrevJump', 'PrevPage', 'Number', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total'],
        perfect: true
      }
    },
    footData() {
      return this.mxTableFootData
    }
  },

  methods: {
    pagerChange({ type, currentPage, pageSize }) {
      if (type == 'current') {
        this.$emit('changePageNo', currentPage)
      } else if (type == 'size') {
        this.$emit('changePageSize', pageSize)
      }
    },
    findList() {
    },
    sortChange({ column, property, order }) {
      this.$emit('sortTable', property, order)
    },
    checkChange(info) {
      const { records, checked, row, rowIndex } = info
      this.$emit('on-checkbox', { records, rowIndex, checked })
    },
    checkChangeall(info) {
      const { records, checked, row } = info
      this.$emit('on-checkbox', { records, rowIndex: null, checked })
    },
    footerMethod({ columns, data }) {
      this.$emit('footerMethod', { columns, data })
      return this.$store.state.hxlhTableFootData
    },
    handleSum(list, field) {
      var total = 0
      for (var index = 0; index < list.length; index++) {
        total += Number(list[index][field] || 0)
      }
      return total
    },
    // 在值发生改变时更新表尾合计
    updateFooter(params) {
      const xTable = this.$refs.vxeTable
      xTable.updateFooter()
    },
    // 取消复选框选择
    clearCheckboxRow() {
      const xTable = this.$refs.vxeTable
      xTable.clearCheckboxRow()
    }
  }
}
</script>

<style scoped lang="less">

</style>

<style lang="less">
  .hxlh-table .vxe-toolbar .vxe-tools--operate {
    margin-top: -23px;
  }

  .hxlh-table .vxe-toolbar {
    min-height: 52px;
    height: auto;
  }

  .vxe-table .vxe-footer--column.col-red {
    color: red;
  }

</style>

注: 这里为什么要去构筑组件呢,是因为方面我们项目中直接导入这个构筑好的组件去使用,这样可以提高项目表格结构的统一性,也便于管理所有表格的默认状态,初始状态与功能。

4.页面使用

在页面上到组件并使用即可。
导入:

import HxlhTable from '@/components/hxlh-table/hxlh-table'
//--------
components: {HxlhTable},

完整代码:

<template>
  <div id="view">
    <el-card style="width: 100%" class="box-card">
      <div slot="header" class="clearfix">
        <span><b>表格展示</b></span>
      </div>
      <div style="width: 100%;display: flex;flex-direction: column;align-items: center;">
        <hxlh-table
          style="width: 100%"
          :columns="columns"
          :data="tableData"
          :loading="loading"
          :page="page"
        >
          <!--查询条件-->
          <el-form ref="queryForm" style="width: 100%" inline>
            <el-form-item label="接口名" style="float: left" class="form_btn ">
              <el-input v-model="selectItem.name" autocomplete="off"></el-input>
            </el-form-item>
            <el-form-item style="float: right" class="form_btn ">
              <el-button icon="el-icon-search" @click="alert('暂时无法搜索')">搜索</el-button>
            </el-form-item>
          </el-form>
        </hxlh-table>
      </div>
    </el-card>
  </div>
</template>

<script>
  import HxlhTable from '@/components/hxlh-table/hxlh-table'

  export default {
    name: 'dashboard',
    components: {HxlhTable},
    data() {
      return {
        //搜索使用组件
        selectItem: {
          name: '',
        },
        // 表格-项目所有数据
        tableData: [{
          code:'111',
          name:'张三',
          sex:'男'
        },{
          code:'222',
          name:'李四',
          sex:'男'
        },{
          code:'333',
          name:'王五',
          sex:'男'
        },{
          code:'444',
          name:'赵六',
          sex:'女'
        }
        ],
        // 表格配置
        columns: [
          {type: 'seq', title: '序号', width: 60},
          {
            title: '编号',
            field: 'code'
          },
          {
            title: '名称',
            field: 'name'
          },
          {
            title: '性别',
            field: 'sex'
          },
        ],
        // 表格缓冲
        loading: false,
        /* 分页属性*/
        page: {
          total: 4,
          current: 1,
          size: 10
        }
      }
    },
    mounted() {
    },
    methods: {

    }
  }
</script>

<style scoped="scoped">
  #view {
    width: 100%;
    height: 100%;
    padding: 0px;
    margin: 0px;
  }

  .box-card {
    width: 480px;
  }
</style>

效果:
在这里插入图片描述

注: 项目中如没有less-loader 会报错提示需要安装less-loader,使用npm install安装上即可。

到这里就可以正常使用了,另外分享一下官方API文档:https://xuliangzhan.gitee.io/vxe-table/#/table/start/use

本教程是我在项目中边集成边写的,绝对保证了真实性可用性。部分地方写的不到位的欢迎指出,蟹蟹。

如果觉得有帮助的话给个免费的点赞吧,Thanks♪(・ω・)ノ

Logo

前往低代码交流专区

更多推荐