Vue基础篇--table的封装

1、 在components文件夹中新建一个ITable的vue文件

<template>
    <div class="tl-rl">
        <template :table="table">
            <el-table
                    v-loading="table.loading"
                    :show-summary="table.hasShowSummary"
                    :summary-method="table.getSummaries"
                    ref="TlRlTable"
                    :data="table.data"
                    tooltip-effect="dark"
                    :border="table.border"
                    :height="table.height"
                    :align="table.align"
                    style="width: 100%"
                    :show-overflow-tooltip="true"
                    :row-class-name="rowClassName"
                    :span-method="objectSpanMethod"
                    header-row-class-name="thClassName"
                    @selection-change="handleSelectionChange"
                    @row-click="rowClick">
                <el-table-column
                        :align="table.align"
                        :show-overflow-tooltip="true"
                        v-if="table.hasSelect"
                        type="selection"
                        width="55">
                </el-table-column>
                <el-table-column type="expand" :show-overflow-tooltip="true" :align="table.align" v-if="table.hasExpand">
                    <template slot-scope="props">
                        <el-form label-position="left" inline class="demo-table-expand">
                            <el-form-item :label="item.label" v-for="item in table.expands" :key="item.id">
                                <span>{{ props.row[item.prop] }}</span>
                            </el-form-item>
                        </el-form>
                    </template>
                </el-table-column>
                <!--<el-table-column-->
                <!--v-for="item in table.tr"-->
                <!--v-if="item.show === false ? item.show : true"-->
                <!--:label="item.label"-->
                <!--:prop="item.prop"-->
                <!--:class-name="item.className ? item.className : ''"-->
                <!--:key="item.id"-->
                <!--:width="item.width ? item.width : ''"-->
                <!--:min-width="item.minWidth ? item.minWidth : ''">-->
                <!--</el-table-column>-->
                <template v-for="item in table.tr">
                    <el-table-column
                            :show-overflow-tooltip="true"
                            :align="table.align"
                            v-if="item.show !== false && item.show === 'template'"
                            :label="item.label"
                            :class-name="item.className ? item.className : ''"
                            :key="item.id"
                            :width="item.width ? item.width : ''"
                            :min-width="item.minWidth ? item.minWidth : ''" >
                        <template slot-scope="scope">
                            <slot :name="item.prop" :obj="scope"></slot>
                        </template>
                    </el-table-column>
                    <el-table-column
                            :show-overflow-tooltip="true"
                            :align="table.align"
                            v-else-if="item.show !== false && item.show !== 'template'"
                            :label="item.label"
                            :prop="item.prop"
                            :class-name="item.className ? item.className : ''"
                            :key="item.id"
                            :width="item.width ? item.width : ''"
                            :min-width="item.minWidth ? item.minWidth : ''" >
                    </el-table-column>
                </template>
                <el-table-column
                        :align="table.align"
                        column-key="operation"
                        :label="table.operation.label"
                        :width="table.operation.width ? table.operation.width : ''"
                        :min-width="table.operation.minWidth ? table.operation.minWidth : ''"
                        :class-name="table.operation.className"
                        v-if="table.hasOperation">
                    <template slot-scope="scope">
                        <el-button
                                v-for="item in table.operation.data"
                                :class="item.classname ? item.classname : ''"
                                :key="item.id"
                                :type="item.type"
                                :size="item.size"
                                @click.stop="handleOperation(scope.$index, scope.row, item.id)">{{ item.label }}</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </template>
    </div>
</template>

<script>
    export default {
        name: 'recordlist',
        props: {
            table: {
                type: Object,
                default() {
                    return {
                        hasMergeRowOrColumn: false, // 是否合并单元格
                        loading: false,          // 加载中动画
                        hasShowSummary: false,   // 是否显示表位合计行
                        border: false,           // 是否带有纵向边框,默认为false
                        height: "",        // 设置table的高度
                        align: 'center',   // 设置数据居中显示
                        hasSelect: false,        // 有无选中功能
                        hasOperation: false,     // 有无操作功能
                        hasExpand: false,        // 有无展开行功能
                        tr: [                    // 表头数据 —— className:列的class名
                            {
                                id: '1',
                                label: 'label',
                                prop: 'prop',
                                className: 'classname',
                                minWidth: '80',
                                show: true           // show有三种值:false隐藏当前列,true常规表格列,template自定义表格列
//          <template slot-scope="props" slot="example">
//                <a class="list-a" target="_blank" :href="'/#/bombscreen?mobile=' + props.obj.row.mobile">{{ props.obj.row.username }}</a>
//          </template>
                            }
                        ],
                        data: [],                // 表格数据 —— 如需添加行class,处理数据时则需要传入class名, class需为数组
                        operation: {             // 操作功能
                            label: '操作',                // 操作列的行首文字
                            width: '200',                // 操作列的宽度
                            className: '',               // 操作列的class名
                            data: [                      // 操作列数据
                                {
                                    label: '通过',                // 按钮文字
                                    Fun: 'handleSubmit',         // 点击按钮后触发的父组件事件
                                    size: 'mini',                // 按钮大小
                                    id: '1',                     // 按钮循环组件的key值
                                    classname: 'show',         // 按钮的类名
                                    type: 'primary'             // 按钮的类型
                                }
                            ]
                        },
                        expands: [               // 展开行数据
                            {
                                id: '1',
                                label: 'label',
                                prop: 'prop'
                            }
                        ],
                        getSummaries(param) {               // 自定义表位合计行数据
                            // *** 此函数传入param参数
                            console.log(param);
                            // *** 最后返回一个数组,合计行会显示数组中的内容
                            return []
                        }
                    }
                }
            }
        },
        methods: {
            handleSelectionChange(val) {
                this.$emit('onHandleSelectionChange', val);
            },
            handleOperation(a, b, id) {
                const data = this.table.operation.data;
                for (let i = 0; i < data.length; i++) {
                    if (id === data[i].id) {
                        this.$emit(data[i].Fun, a, b);
                    }
                }
            },
            objectSpanMethod({ row, column, rowIndex, columnIndex }) {
                if (!this.hasMergeRowOrColumn) {
                    return
                } else {
                    this.$emit('onMergeRowOrColumn', { row, column, rowIndex, columnIndex });
                }
            },
            // 点击某一行时触发的函数
            // *** 按下左键然后移动鼠标到其它列放开左键,会有报错 -- 优化:添加点击行参数,
            rowClick(Row, Event, Column) {
                if (!Column || Column.type === 'selection' || Column.columnKey === 'operation' || Column.type === 'expand') {
                    return
                }
                const data = {
                    row: Row,
                    event: Event,
                    column: Column
                };
                this.$emit('onRowClick', data)
            },
            // 行类名的回调函数
            // 在表格数据中添加class字段即为表格行类名,配合css可对表格行中的自定义标签进行样式优化
            rowClassName(rowdata) {
                const data = this.table.data;
                let className = data[rowdata.rowIndex].class ? data[rowdata.rowIndex].class : '';
                if (className.length === 0) {
                    return
                }
                className = className.join(' ');
                return className
            },
        }
    }
</script>

2、在单页面中引入ITable组件并使用,代码如下:

<template>  
<!--region table 表格-->
      <iTable :table="dataTable" @onRowClick="rowClick">
        <!--自定义当前的列-->
        <template slot-scope="props" slot="username">
          <a class="template-username" style="color: blueviolet;border:1px solid #ccc" :href="'/#/bombscreen?mobile=' + props.obj.row.id" target="_blank">{{ props.obj.row.username }}</a>
        </template>

      </iTable>
</template>
<script>
import iTable from '@/components/ITable'

export default {
  name: 'Dept',
    components: {iTable},
data() {
    return {
      dataTable: {
        tr: [
          {
            id: '1',
            label: '用户名',
            prop: 'username',
            show: 'template',
            className: 'username'
          },
          {
            id: '2',
            label: '真实姓名',
            prop: 'real_name'
          },
          {
            id: '3',
            label: '性别',
            prop: 'sex_value'
          },
          {
            id: '11',
            label: '客服',
            prop: 'agent_name'
          },
          {
            id: '7',
            label: '渠道',
            prop: 'channel_id'
          },
          {
            id: '8',
            label: '注册时间',
            prop: 'regist_time',
            minWidth: '150'
          },
          {
            id: '9',
            label: '上次登录时间',
            prop: 'login_time',
            minWidth: '150'
          },
          {
            id: '10',
            label: '用户状态',
            prop: 'status_value'
          }
        ],
        operation:{
          label: '操作',                // 操作列的行首文字
          width: '200',
          data: [                      // 操作列数据
            {
              label: '添加',                // 按钮文字
              Fun: 'commitDate',         // 点击按钮后触发的父组件事件
              size: 'mini',                // 按钮大小
              id: '1',                     // 按钮循环组件的key值
              classname: 'show',            // 按钮的类名
              type: 'primary'
            },{
              label: '删除',                // 按钮文字
              Fun: 'deleteDate',         // 点击按钮后触发的父组件事件
              size: 'mini',                // 按钮大小
              id: '1',                     // 按钮循环组件的key值
              classname: 'show',            // 按钮的类名
              type: 'danger'
            }
          ]
        },
        data: [
                {
          username: '呆萌图',
          real_name: '张三',
          sex_value: '男',
          agent_name: '黎明',
          channel_id: '网购22222222222222222222222211111111111111111',
          regist_time: '2020-1-2',
          login_time: '2020-1-22',
          status_value: 'ok'
        },
          {
            username: '呆萌图',
            real_name: '张三',
            sex_value: '男',
            agent_name: '黎明',
            channel_id: '网购',
            regist_time: '2020-1-2',
            login_time: '2020-1-22',
            status_value: 'ok'
          },
          {
            username: '呆萌图',
            real_name: '张三',
            sex_value: '男',
            agent_name: '黎明',
            channel_id: '网购',
            regist_time: '2020-1-2',
            login_time: '2020-1-22',
            status_value: 'ok'
          },
          {
            username: '呆萌图',
            real_name: '张三',
            sex_value: '男',
            agent_name: '黎明',
            channel_id: '网购',
            regist_time: '2020-1-2',
            login_time: '2020-1-22',
            status_value: 'ok'
          }],
        border: true,
        height:"calc(100vh - 300px)",
        loading: false,
        align: "center",
        hasOperation: true,
      }
    }
  }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值