创建一个 createTable.js 文件
/** * 动态创建 table * @module widgets/my-table * @example * * // 使用说明 */ export default { name: "createTable", /** * 属性参数 * @property {Array} [tableData = []] data table表格数据 * @property {Array} [tableHeader = []] data table头部内容 * @property {Object} [defaultName = { lable: "lable", prop: "prop", icon: "icon", width: "width", type: "type", tag: "tag", tableColumnAttributes: "tableColumnAttributes" }] defaultName 指引查找参数 * @property {Function} cellClick 当某个单元格被点击时会触发该事件 row, column, cell, event * @property {Function} select 当用户手动勾选数据行的 Checkbox 时触发的事件 selection, row * @property {Function} selectAll 当用户手动勾选全选 Checkbox 时触发的事件 selection * @property {Function} selectionChange 当选择项发生变化时会触发该事件 selection * @property {Function} cellMouseEnter 当单元格 hover 进入时会触发该事件 row, column, cell, event * @property {Function} cellMouseLeave 当单元格 hover 退出时会触发该事件 row, column, cell, event * @property {Function} celldblClick 当某个单元格被双击击时会触发该事件 row, column, cell, event * @property {Function} rowClick 当某一行被点击时会触发该事件 row, column, event * @property {Function} rowContextMenu 当某一行被鼠标右键点击时会触发该事件 row, column, event * @property {Function} rowdblClick 当某一行被双击时会触发该事件 row, column, event * @property {Function} headerClick 当某一列的表头被点击时会触发该事件 column, event * @property {Function} headerContextMenu 当某一列的表头被鼠标右键点击时触发该事件 column, event * @property {Object} tableAttributes(Table Attributes) 参考 https://element.eleme.cn/#/zh-CN/component/table (max-height 这种要写成maxHeight) * @property {Function} operationCallback 操作项回调 event, props */ props: { // 数据字段名称映射 defaultName: { type: Object, default() { return { lable: "lable", prop: "prop", icon: "icon", width: "width", type: "type", tag: "tag", tableColumnAttributes: "tableColumnAttributes" }; } }, tableData: { type: Array, default() { return []; } }, tableHeader: { type: Array, default() { return []; } }, cellClick: { type: Function, default: res => { return res; } }, select: { type: Function, default: res => { return res; } }, selectAll: { type: Function, default: res => { return res; } }, selectionChange: { type: Function, default: res => { return res; } }, cellMouseEnter: { type: Function, default: res => { return res; } }, cellMouseLeave: { type: Function, default: res => { return res; } }, celldblClick: { type: Function, default: res => { return res; } }, rowClick: { type: Function, default: res => { return res; } }, rowContextMenu: { type: Function, default: res => { return res; } }, rowdblClick: { type: Function, default: res => { return res; } }, headerClick: { type: Function, default: res => { return res; } }, headerContextMenu: { type: Function, default: res => { return res; } }, tableAttributes: { type: Object, default() { return { stripe: false, border: false }; } }, operationCallback: { type: Function, default: res => { return res; } } }, methods: { grouping(array) { let groups = { default: [] }; let props = this.defaultName; array.forEach(n => { let key = n[props.group]; if (key) { groups[key] = groups[key] || []; groups[key].push(n); } else { groups["default"].push(n); } }); return groups; }, createTableColumn(h, item) { let props = this.defaultName; return h("el-table-column", { props: { ...item[props.tableColumnAttributes], prop: item[props.prop], label: item[props.lable], width: item[props.width] } }); }, createTableColumnSelect(h, item) { let props = this.defaultName; return h("el-table-column", { props: { ...item[props.tableColumnAttributes], width: item[props.width], type: "selection" } }); }, createTableColumnOperation(h, item) { let props = this.defaultName; let tagItem = item[props.tag]; let _this = this; return h("el-table-column", { props: { ...item[props.tableColumnAttributes], prop: item[props.prop], label: item[props.lable], width: item[props.width] }, scopedSlots: { default: function(props) { let nodes = []; tagItem.forEach(items => { nodes.push( h( items.tagType, { props: { ...items.attributes }, nativeOn: { click: event => { _this.operationCallback(event, props); } } }, items.name ) ); }); return nodes; } } }); }, createNodes(h, array) { let nodes = [], groups = this.grouping(array); let props = this.defaultName; for (let key in groups) { let items = groups[key] || []; items.forEach(item => { // nodes.push(this.createTableColumn(h, item)); if (item[props.type] === "normal") { //创建数据列 nodes.push(this.createTableColumn(h, item)); } else if (item[props.type].toLowerCase() == "select") { //创建选择列 nodes.push(this.createTableColumnSelect(h, item)); } else { if (item[props.tag].length > 0 && item[props.tag] != undefined) { //创建操作列 nodes.push(this.createTableColumnOperation(h, item)); } } }); } return nodes; } }, render(h) { console.log(1); return h( "el-table", { props: { ...this.tableAttributes, data: this.tableData }, nativeOn: {}, class: "custom-table", on: { select: (selection, row) => { this.select(selection, row); }, "select-all": selection => { this.selectAll(selection); }, "selection-change": selection => { this.selectionChange(selection); }, "cell-mouse-enter": (row, column, cell, event) => { this.cellMouseEnter(row, column, cell, event); }, "cell-mouse-leave": (row, column, cell, event) => { this.cellMouseLeave(row, column, cell, event); }, "cell-click": (row, column, cell, event) => { this.cellClick(row, column, cell, event); }, "cell-dblclick": (row, column, cell, event) => { this.celldblClick(row, column, cell, event); }, "row-click": (row, column, event) => { this.rowClick(row, column, event); }, "row-contextmenu": (row, column, event) => { this.rowContextMenu(row, column, event); }, "row-dblclick": (row, column, event) => { this.rowdblClick(row, column, event); }, "header-click": (column, event) => { this.headerClick(column, event); }, "header-contextmenu": (column, event) => { this.headerContextMenu(column, event); } // "sort-change": (selection, row) => { // console.log(selection, row); // }, // "filter-change": (selection, row) => { // console.log(selection, row); // }, // select: (selection, row) => { // console.log(selection, row); // } }, ref: "table" }, this.createNodes(h, this.tableHeader) ); } }; /**render(createElement){ return createElement('标签名','执行的操作','展示的内容') } */
创建table数据标题文件
/*** * @property {Object} tableColumnAttributes 对应(Table-column Attributes) https://element.eleme.cn/#/zh-CN/component/table 但lable、prop、width 参数除外 * type 用来做类型判断 目前有三种一是 normal 二是select 三默认 分别对应生成数据表格、table表格可选、操作按钮生成 */ module.exports = { test: [ { lable: "站點", prop: "name", width: "60", type: "normal", tableColumnAttributes: {} }, { lable: "站點編碼", prop: "date", type: "normal" }, { lable: "綁定線路", prop: "address", type: "normal" }, { lable: "站牌種類", prop: "1", type: "normal" }, { lable: "佈局模式", prop: "1", type: "normal" }, { lable: "重啟時間", prop: "1", type: "normal" }, { lable: "同步時間", prop: "1", type: "normal" }, { lable: "節目下載", prop: "1", type: "normal" }, { lable: "截屏", prop: "1", type: "normal" }, { lable: "刷新頻率", prop: "1", type: "normal" }, { lable: "黑夜模式", prop: "1", type: "normal" }, { lable: "狀態", prop: "1", type: "normal" }, { lable: "詳情", prop: "1", type: "button", tag: [ { name: "删除", tagType: "el-button", attributes: { size: "mini", type: "danger" } } ] } ] };
使用
<template> <section class="content"> <el-row> <el-col :span="24" ><div class="grid-content bg-purple-dark"> <createTable :tableData="tableData" :tableHeader="tableDataHeader" :tableAttributes="{ stripe: true, border: true }" :operationCallback="sdf" > </createTable></div ></el-col> </el-row> </section> </template> <script> import tableHeader from "../components/table/testTable.js"; export default { data() { return { tableData: [ { date: "2016-05-02", name: "王小虎", address: "上海市普陀区金沙江路 1518 弄", tempHtml: `<el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>` }, { date: "2016-05-04", name: "王小虎", address: "上海市普陀区金沙江路 1517 弄", tempHtml: `<el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>` }, { date: "2016-05-01", name: "王小虎", address: "上海市普陀区金沙江路 1519 弄", tempHtml: `<button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</button>` }, { date: "2016-05-03", name: "王小虎", address: "上海市普陀区金沙江路 1516 弄", tempHtml: `<el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>` } ], tableDataHeader: null }; }, created: function() { console.log(tableHeader); this.tableDataHeader = tableHeader.test; }, methods: { sdf(event, props) { console.log(event, props); } }, components: { createTable: resolve => require(["../components/table/createTable.js"], resolve) } }; </script> <style scoped> .content { box-sizing: border-box; padding: 15px; } </style>
效果:
评论区