阅读量:0
用vue+element ui开发管理系统时,使用el-table做表格,当表格列过多的时候,想要做成可选表头的,实现表格列的筛选显示,效果如下:
代码文件结构:
废话不多说,直接上代码:
第一步:新建名为 TableHeaderRender.vue 的文件
<template> <el-popover placement="bottom" width="200" trigger="manual" v-model="visible" @show="showPopover" popper-class="table-header-popover" > <div class="table-header-popover-template"> <el-input placeholder="请输入内容" v-model="value" size="small" clearable @keyup.enter.native="confirm" ref="sInput" > <!-- <el-button slot="append" icon="el-icon-search" @click="confirm"> --> <!-- </el-button> --> </el-input> </div> <div class="el-table-filter__bottom"> <button @click="confirm">筛选</button> <button @click="resetData">重置</button> </div> <span slot="reference" style="margin-left: 5px" @click.stop="popClick" v-click-outside="closeOver" > <i class="filter-icon el-icon-search" :style="{ color: iconColor ? '#9a4b9b' : '#909399' }" ></i> <!-- <i class="el-icon-search" :style="{'color':iconColor}" ></i> --> <!-- <svg viewBox="64 64 896 896" data-icon="search" width="1em" height="1em" fill="currentColor" :style="{ color: iconColor ? '#9A4B9B' : '', 'margin-right': '2px', cursor: 'pointer', }" > <path d="M909.6 854.5L649.9 594.8C690.2 542.7 712 479 712 412c0-80.2-31.3-155.4-87.9-212.1-56.6-56.7-132-87.9-212.1-87.9s-155.5 31.3-212.1 87.9C143.2 256.5 112 331.8 112 412c0 80.1 31.3 155.5 87.9 212.1C256.5 680.8 331.8 712 412 712c67 0 130.6-21.8 182.7-62l259.7 259.6a8.2 8.2 0 0 0 11.6 0l43.6-43.5a8.2 8.2 0 0 0 0-11.6zM570.4 570.4C528 612.7 471.8 636 412 636s-116-23.3-158.4-65.6C211.3 528 188 471.8 188 412s23.3-116.1 65.6-158.4C296 211.3 352.2 188 412 188s116.1 23.2 158.4 65.6S636 352.2 636 412s-23.3 116.1-65.6 158.4z" ></path> </svg> --> </span> </el-popover> </template> <script> export default { name: "tableHeaderRender", data() { return { // input 绑定的值 value: "", visible: false, iconColor: false, }; }, props: { tableColumn: { type: Object, default: () => {}, }, columnProp: { type: String, default: "", }, defaultValue: { type: String, default: "", }, inputFilteredMap: { type: Object, default: () => {}, }, }, created() { this.value = this.defaultValue; this.iconColor = this.value.trim() ? true : false; }, methods: { showPopover() { this.$nextTick(() => { this.$refs.sInput.focus(); }); }, resetData() { console.log("reset"); this.value = ""; this.visible = false; this.iconColor = false; const self = this; if (this.inputFilteredMap[self.columnProp]) { delete this.inputFilteredMap[self.columnProp]; } self.$emit("resetChangeMethod", this.tableColumn, self.columnProp); }, closeOver() { this.visible = false; }, popClick(e) { // e.stopPropagation() this.visible = !this.visible; }, confirm() { this.visible = false; if (this.value.trim()) { this.iconColor = true; this.inputFilteredMap[this.columnProp] = this.value; this.$emit( "filterInputMethod", this.tableColumn, this.inputFilteredMap ); } else { // 如果搜索input输入为空,等同重置 this.resetData(); } }, }, directives: { clickOutside: { bind(el, binding, vnode) { function clickHandler(e) { // 这里判断点击的元素是否是本身,是本身,则返回 if (el.contains(e.target)) { return false; } // 判断指令中是否绑定了函数 if (binding.expression) { // 如果绑定了函数 则调用那个函数,此处binding.value就是handleClose方法 binding.value(e); } } // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听 el.__vueClickOutside__ = clickHandler; document.addEventListener("click", clickHandler); }, update() {}, unbind(el, binding) { // 解除事件监听 document.removeEventListener("click", el.__vueClickOutside__); delete el.__vueClickOutside__; }, }, }, }; </script> <style> .filter-icon { font-size: 14px; color: #909399; cursor: pointer; font-weight: 400; } .table-header-popover { padding: 0; } .table-header-popover .table-header-popover-template { margin: 10px; } </style>
第二步:新建名为 operateTable.vue 的文件
<template> <div class="operateTable"> <el-dropdown size="small" trigger="click" v-if="options.columnsSelect || options.columnsTreeSelect" class="column-dropdown" > <el-button style="padding: 9px 10px!important" size="small"> <i style="font-size: 12px" class="el-icon-menu"></i> <i class="el-icon-arrow-down el-icon--right"></i> </el-button> <el-dropdown-menu slot="dropdown"> <div style="margin:10px;" class="caoz_ft_warp" v-if="isInit||isSave"> <el-button v-if="isInit" size="small" type="primary" plain style="width:70px;" @click="initColumns(true)" >初始化</el-button> <el-button v-if="isSave" size="small" type="primary" plain style="width:70px;" @click="$emit('saveSettingColumns',checkedList)" >保存</el-button> </div> <div style="margin:10px;" class="caoz_ft_warp"> <el-input size="small" placeholder="请输入关键字" v-model="cloumnKeyword" clearable></el-input> </div> <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange" style="padding-left:10px;">Select All</el-checkbox> <el-checkbox-group v-if="!options.columnsTreeSelect" v-model="checkedList" style="max-height: 300px" @change="handleCheckedCitiesChange" > <div class="checkboxScorll"> <template v-for="(option, index) in checkBoxOptions"> <template v-if="cloumnKeyword && option.toLowerCase().indexOf(cloumnKeyword.toLowerCase())>-1"> <el-checkbox :key="index" class="checkbox" :label="option" ></el-checkbox> </template> <template v-else-if="!cloumnKeyword"> <el-checkbox :key="index" class="checkbox" :label="option" ></el-checkbox> </template> <template v-else></template> </template> </div> </el-checkbox-group> <div v-else class="checkboxTree"> <el-tree ref="tree" :check-on-click-node="true" :data="treeColumn" show-checkbox node-key="label" :default-expanded-keys="defaultExpanded" :default-checked-keys="defaultChecked" :props="{ children: 'children', label: 'label', }" @check="checkChange" style="max-height: 300px; overflow-y: auto" > </el-tree> </div> </el-dropdown-menu> </el-dropdown> <el-table id="iTable" ref="operateTable" border :data="dataSource" :stripe="options.stripe" :highlight-current-row="options.highlightCurrentRow" :max-height="options.maxHeight" :size="options.size" :fit="options.fit" :show-header="options.showHeader" :empty-text="options.emptyText" :default-sort="options.defaultSort" :row-key="getRowKeys" :default-expand-all="options.defaultExpandAll" :tree-props="options.treeProps" :lazy="options.lazy" :load="load" @cell-mouse-enter="cellMouseEnter" @cell-mouse-leave="cellMouseLeave" @cell-click="cellClick" @cell-dblclick="cellDblclick" @row-click="rowClick" @row-contextmenu="rowContextmenu" @row-dblclick="rowDblclick" @header-click="headerClick" @header-contextmenu="headerContextmenu" @sort-change="sortChange" @select="select" @select-all="selectAll" @selection-change="checkboxSelected" @filter-change="filterChange" > <slot name="expandRow"></slot> <!-- 复选框 --> <el-table-column :reserve-selection="options.reserveSelection" :key="0" type="selection" :selectable="selectable" width="40" align="left" v-if="options.showCheckBox" :resizable="false" > </el-table-column> <el-table-column ref="fixedColumn" label="操作" align="left" :width="operates.dropDown ? '50' : operates.width" :fixed="operates.fixed" :min-width="operates.minwidth" :resizable="operates.resizable" v-if="operates.list.length > 0" > <template slot-scope="scope"> <!-- 操作列 不折叠 全为icon--> <div class="operate-group" v-if="!operates.dropDown && !operates.isText" > <template v-for="item in operates.list[0] instanceof Array ? operates.list[scope.$index] : operates.list" > <div class="item" v-if="item.show" :key="item.id"> <el-switch v-if="item.type === 'switch'" v-model="scope.row[item.prop]" active-color="#13ce66" @change="item.method(scope.$index, scope.row)" ></el-switch> <el-tooltip v-else-if="item.type === 'tooltipIcon'" :enterable="false" effect="light" placement="bottom" > <div slot="content">{{ item.tooltip }}</div> <el-button type="primary" plain :icon="item.icon" size="mini" :disabled="item.disabled" @click="item.method(scope.$index, scope.row)" ></el-button> </el-tooltip> <el-button v-else-if="item.type === 'icon'" type="primary" plain :icon="item.icon" size="mini" :disabled="item.disabled" @click="item.method(scope.$index, scope.row)" ></el-button> </div> </template> </div> <!-- 操作列 不折叠 全为文字--> <div class="operate-group" v-if="!operates.dropDown && operates.isText" > <template v-for="item in operates.list[0] instanceof Array ? operates.list[scope.$index] : operates.list" > <div class="item" v-if="item.show" :key="item.id"> <el-button size="small" type="text" :disabled="item.disabled" @click.native.prevent="item.method(scope.$index, scope.row)" >{{ item.label }}</el-button > </div> </template> </div> <!-- 操作列 折叠下拉--> <div class="operate-group" v-else-if="operates.dropDown"> <el-dropdown @command="handleCommand" trigger="hover" placement="bottom-start" > <span class="el-dropdown-link"> <i class="el-icon-s-unfold" style="font-size: 16px;"></i> </span> <!-- 根据operates.list 来渲染操作列下拉的内容 --> <el-dropdown-menu slot="dropdown"> <el-dropdown-item v-for="(item, index) in operates.list[0] instanceof Array ? operates.list[scope.$index] : operates.list" :disabled="item.disabled" :key="index" :command="composeValue(item, scope.row, scope.$index)" >{{ item.label }}</el-dropdown-item > </el-dropdown-menu> </el-dropdown> </div> </template> </el-table-column> <!--region 数据列--> <template v-for="column in columns"> <!-- :filter-method="column.filters ? column.filterMethod : undefined" --> <!-- v-if=" options.columnsSelect || options.columnsTreeSelect ? checkedList.includes(column.label) : true " --> <el-table-column v-if=" options.columnsSelect || options.columnsTreeSelect ? checkedList.includes(column.label) : true " :prop="column.prop" :key="column.label" :label="column.label" align="left" :width="column.width" :min-width="column.minwidth" :resizable="column.resizable" :sortable="column.sortable" :filters="column.filters" :filter-method="column.filters ? column.filterMethod : undefined" :filtered-value="column.filteredValue" :fixed="column.fixed" :column-key="column.prop" > <template slot="header" slot-scope="scope" >{{ column.label }} <TableHeaderRender v-if="column.filterInput" :columnProp="column.prop" :tableColumn="scope.column" :defaultValue="column.defaultValue" :inputFilteredMap="inputFilteredMap" @filterInputMethod="filterInputMethod" @resetChangeMethod="resetChangeMethod" ></TableHeaderRender> </template> <!-- :filtered-value="column.filteredValue" --> <template slot-scope="scope"> <!-- 如果传进来的column没有render函数执行以下代码 --> <template v-if="!column.render"> <!-- 如果传进来的column没有render函数但有formatter函数执行以下代码 --> <template v-if="column.formatter"> <span v-html="column.formatter(scope.row, column)"></span> </template> <!-- 如果传进来的column既没有render函数也没有formatter函数执行以下代码 --> <template v-else> <span>{{ scope.row[column.prop] }}</span> </template> </template> <!-- 如果传进来的column有render函数执行以下代码 --> <template v-else> <expand-dom :column="column" :row="scope.row" :render="column.render" :index="scope.$index" ></expand-dom> </template> </template> </el-table-column> </template> <!--endregion--> </el-table> </div> </template> <script> import TableHeaderRender from "./TableHeaderRender.vue"; export default { name: "OperateTable", props: { // 表格的数据源 dataSource: { type: Array, default: () => [], }, // 需要展示的列 columns: { type: Array, default: () => [{}], }, // table 表格的控制参数 options: { type: Object, default: () => { return { stripe: true, // 是否为斑马纹 table }; }, }, // 操作按钮组 === label: 文本,show:是否显示,icon:按钮图标,disabled:是否禁用,method:回调方法, 等等 operates: { type: Object, default: () => { return { list: [], }; }, }, defaultSelectedColumn: { type: Array, default: () => [], }, defaultColumn: { type: Array, default: () => [], }, totalColumn: { type: Array, default: () => [], }, treeColumn: { type: Array, default: () => [], }, defaultChecked: { type: Array, default: () => [], }, defaultExpanded: { type: Array, default: () => [], }, isInit: { type: Boolean, default: false }, isSave: { type: Boolean, default: false } }, components: { TableHeaderRender, expandDom: { functional: true, props: { row: Object, render: Function, index: Number, column: { type: Object, default: null, }, }, render: (h, ctx) => { const params = { row: ctx.props.row, index: ctx.props.index, }; if (ctx.props.column) params.column = ctx.props.column; return ctx.props.render(h, params); }, }, }, data() { return { cloumnKeyword:"",//字段关键字搜索 isIndeterminate:true,//全选状态 checkAll:false,//字段全选 checkBoxOptions: [], // 全部表头 checkedList: [], // 选中表头 count: 0, // 用于判断表格是否刚渲染 isCheckBoxSort: false, // 用于判断是否是由自定义数据列引发的排序 // 以下是之前放于vuex中用于记录状态 preCheckedList: [], // 前一次的checkbox // 排序的状态 sort: { prop: "", order: "", label: "", }, // 筛选的状态 checkBoxFilteredMap: {}, // input 所有的筛选 inputFilteredMap: {}, // columns label及prop对应的键值对 columnsLabelMap: {} }; }, watch: { // 监听defaultColumn,若这个发生变化,代表传入的默认column变化,即数据表格发生了切换 defaultColumn() { this.initColumns(); }, checkedList() { // if(this.checkedList.length>0){ // this.$emit("selectedColumn",this.checkedList); // } // 处理当点击checkbox显示的是排序列时,恢复排序列的显示 let showLabelArray = this.checkboxShowLabel(); console.log("showLabelArray", showLabelArray); // if (value.length !== 0) { // value.map((item) => { // this.handleStatusRevert(item); // }); this.columns.map((column, index) => { this.handleStatusRevert(column, index, showLabelArray); }); }, }, created() { this.normalizeColumnsLabelMap(); }, mounted() { if (!this.options.columnsTreeSelect) { this.checkedList = this.$props.defaultColumn; this.checkBoxOptions = this.$props.totalColumn; } else { this.checkedList = this.$refs.tree .getCheckedNodes() .map((item) => item.label); } // 挂载时将defaultSort属性传给vuex this.handleDefaultSort(); }, // 动态切换表头的时候闪烁是因为表头重新计算高度导致的,以下方法解决此bug beforeUpdate() { this.$nextTick(() => { //在数据加载完,重新渲染表格 this.$refs["operateTable"].doLayout(); }); }, methods: { //全选字段 handleCheckAllChange(val){ this.checkedList = val ? this.checkBoxOptions : []; this.isIndeterminate = false; }, //反选 handleCheckedCitiesChange(value){ let checkedCount = value.length; this.checkAll = checkedCount === this.checkBoxOptions.length; this.isIndeterminate = checkedCount > 0 && checkedCount < this.checkBoxOptions.length; }, //初始化字段 initColumns(flag){ if(flag){ this.checkedList = this.$props.defaultSelectedColumn; }else{ this.checkedList = this.$props.defaultColumn; } this.checkBoxOptions = this.$props.totalColumn; }, // 处理判断checkbox 点击时,显示的是哪个字段名 checkboxShowLabel() { // 判断显示的字段是哪个字段,如果是树形,可能有多个,故更改为数组接收 let value = []; console.log("this.checkedList", this.checkedList); if (this.count === 0) { this.saveCheckedList(this.checkedList); // this.$componentsStore.commit("table/saveCheckedList", this.checkedList); this.count++; } else { if (this.checkedList.length > this.preCheckedList.length) { for (let index = 0; index < this.checkedList.length; index++) { if (!this.preCheckedList.includes(this.checkedList[index])) { value.push(this.checkedList[index]); } // if (this.checkedList[index] !== this.preCheckedList[index]) { // value = this.checkedList[index]; // } } } this.saveCheckedList(this.checkedList); // this.$componentsStore.commit("table/saveCheckedList", this.checkedList); } return value; }, // 处理sort\filterd由隐藏变为显示状态的恢复 handleStatusRevert(column, index, showLabelArray) { let compareLabel = column.label; if (showLabelArray.includes(compareLabel)) { // 如果是有checkbox 筛选的字段,恢复筛选 let filteredValue = this.checkBoxFilteredMap[this.columnsLabelMap[compareLabel]]; // 如果是有input 筛选的字段,恢复筛选 let filteredInputValue = this.inputFilteredMap[this.columnsLabelMap[compareLabel]]; this.columns[index].filteredValue = filteredValue; this.columns[index].defaultValue = filteredInputValue; this.$nextTick(() => { this.$refs.operateTable.store.states.columns.map((column) => { if (column.filteredValue && column.filteredValue.length) { this.$refs.operateTable.store.commit("filterChange", { column, values: column.filteredValue, silent: true, }); } }); }); } else { this.columns[index].filteredValue = []; this.columns[index].defaultValue = ""; } // 如果是有排序的字段,恢复排序 if (showLabelArray.includes(this.sort.label)) { this.$nextTick(() => { //在数据加载完,重新渲染表格 this.isCheckBoxSort = true; this.$refs.operateTable.sort(this.sort.prop, this.sort.order); }); } /** // 如果是有checkbox 筛选的字段,恢复筛选 let filteredValue = this.checkBoxFilteredMap[this.columnsLabelMap[value]]; // 如果是有input 筛选的字段,恢复筛选 let filteredInputValue = this.inputFilteredMap[ this.columnsLabelMap[value] ]; for (let i = 0; i < this.columns.length; i++) { if (this.columns[i].label === value) { this.columns[i].filteredValue = filteredValue; this.columns[i].defaultValue = filteredInputValue; this.$nextTick(() => { this.$refs.operateTable.store.states.columns.map((column) => { if (column.filteredValue && column.filteredValue.length) { console.log("!11"); this.$refs.operateTable.store.commit("filterChange", { column, values: column.filteredValue, silent: true, }); } }); }); } else { this.columns[i].filteredValue = []; this.columns[i].defaultValue = ""; } } // for (let i = 0; i < this.columns.length; i++) { // if (this.columns[i].label === value) { // this.columns[i].defaultValue = filteredInputValue; // } else { // this.columns[i].defaultValue = ""; // } // } // 如果是有排序的字段,恢复排序 if (value === this.sort.label) { this.$nextTick(() => { //在数据加载完,重新渲染表格 this.isCheckBoxSort = true; this.$refs.operateTable.sort(this.sort.prop, this.sort.order); }); } */ }, // 处理生成columns 的label prop键值对 normalizeColumnsLabelMap() { this.columns.map((column) => { this.columnsLabelMap[column.label] = column.prop; }); }, filterInputMethod(column, inputFilteredMap) { console.log("column, inputFilteredMap", column, inputFilteredMap); this.inputFilteredMap = inputFilteredMap; this.$emit("filterInputMethod", column, inputFilteredMap); }, resetChangeMethod(tableColumn, columnProp) { this.$emit("resetChangeMethod", tableColumn, this.inputFilteredMap); }, cellMouseEnter(row, column, cell, event) { this.$emit("cell-mouse-enter", row, column, cell, event); }, cellMouseLeave(row, column, cell, event) { this.$emit("cell-mouse-leave", row, column, cell, event); }, cellClick(row, column, cell, event) { this.$emit("cell-click", row, column, cell, event); }, cellDblclick(row, column, cell, event) { this.$emit("cell-dblclick", row, column, cell, event); }, rowClick(row, column, event) { this.$emit("row-click", row, column, event); }, rowContextmenu(row, column, event) { this.$emit("row-contextmenu", row, column, event); }, rowDblclick(row, column, event) { this.$emit("row-dblclick", row, column, event); }, headerClick(column, event) { this.$emit("header-click", column, event); }, headerContextmenu(column, event) { this.$emit("header-contextmenu", column, event); }, sortChange(sortObj) { this.changeSort(sortObj); // this.$componentsStore.commit("table/changeSort", sortObj); if (!this.isCheckBoxSort) { this.$emit("sort-change", sortObj); } // 还原isCheckBoxSort this.isCheckBoxSort = false; }, handleDefaultSort() { if (this.options.defaultSort !== undefined) { let column = { label: "" }; // for (let index = 0; index < this.columns.length; index++) { // if (this.columns[index].prop === this.options.defaultSort.prop) { // column.label = this.columns[index].label; // break; // } // } column.label = this.columnsLabelMap[this.options.defaultSort.prop]; this.changeSort({ ...this.options.defaultSort, column, }); } }, // 点击操作的下拉项目后触发事件 handleCommand(command) { if (command.method) { command.method(command.index, command.row, command.label); } }, // 点击dropDown传参方法 composeValue(item, row, index) { return { label: item.label, row: row, index: index, method: item.method, }; }, select(selection, row) { this.$emit("select", selection, row); }, selectAll(selection) { this.$emit("select-all", selection); }, checkboxSelected(selection) { this.$emit("selection-change", selection); }, selectable(row, index) { let data = true; this.$emit("selectable", row, index, (val) => { data = val; }); return data; }, getRowKeys(row) { let data; for (let index = 0; index < this.dataSource.length; index++) { if (row === this.dataSource[index]) { data = index; break; } } // this.dataSource.map((item, index) => { // if (row === item) { // data = index; // } // }); this.$emit("row-key", row, (val) => { data = val; }); return data; }, load(tree, treeNode, resolve) { this.$emit("load", tree, treeNode, resolve); }, // 记录表格总的筛选状态,用于列显示隐藏时保存checkbox状态 filterChange(filters) { let currKey = Object.keys(filters)[0]; if (filters[currKey].length === 0) { delete this.checkBoxFilteredMap[currKey]; } else { this.checkBoxFilteredMap[currKey] = filters[currKey]; } this.$emit("filter-change", filters); }, checkChange(nodeObj, checkObj) { this.checkedList = checkObj.checkedNodes.map((item) => { return item.label; }); }, // 之前写在vuex里的方法 changeSort(sort) { this.sort.prop = sort.prop; this.sort.order = sort.order; this.sort.label = sort.column.label; }, saveCheckedList(preCheckedList) { this.preCheckedList = preCheckedList; }, }, }; </script> <style> .operateTable{ position: relative; width: 100%; } .operateTable .column-dropdown{ position: absolute; right: 0px; top: -42px; z-index: 99; } .caoz_ft_warp{ text-align: center; } .caoz_ft_warp .el-input.is-active .el-input__inner, .caoz_ft_warp .el-input__inner:focus{ border-color: #9A4B9B; outline: 0; } .el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner { background-color: #9a4b9b; border-color: #9a4b9b; } .el-checkbox__inner:hover { border-color: #9A4B9B; } .el-checkbox__input.is-focus .el-checkbox__inner{ border-color: #9A4B9B; } .el-checkbox__input.is-checked+.el-checkbox__label { color: #9A4B9B; } .checkboxScorll .el-checkbox__input.is-checked + .el-checkbox__label { color: #666; } .column-dropdown .el-button{margin-right: 0 !important;min-width:0;} .column-dropdown .el-button:focus, .el-button:hover{ color: #9A4B9B; border-color: #e1c9e1; background-color: #f5edf5; } .checkboxScorll { max-height: 300px; overflow-y: auto; } .checkboxScorll .checkbox { display: block; margin-top: 10px; padding-left: 20px; } </style>
第三步:在页面中引入operateTable并使用
<template> <div class="tableView"> <div class="content"> <operateTable v-loading="loading" :dataSource="operateTableData" :columns="operateTableColumns" :options="operateTableOption" :defaultColumn="defaultColumns" :totalColumn="totalColumns" :defaultSelectedColumn="defaultSelectedColumn" @sort-change="sortChange" @saveSettingColumns="saveSettingColumns" ></operateTable> </div> </div> </template> <script> import operateTable from "./components/operateTable.vue"; export default { name: "", components: { operateTable, }, data() { return { loading: false, operateTableData: [ { date: "2016-05-02", name: "王小虎", address: "上海市普陀区金沙江路 1518 弄", }, { date: "2016-05-04", name: "王小虎", address: "上海市普陀区金沙江路 1517 弄", }, { date: "2016-05-01", name: "王小虎", address: "上海市普陀区金沙江路 1519 弄", }, { date: "2016-05-03", name: "王小虎", address: "上海市普陀区金沙江路 1516 弄", }, ], operateTableColumns: [ { prop: "action", label: "操作", width: 100, fixed: true, render: (h, params) => { return h( "div", { class: "operate-group", }, [ h( "el-tooltip", { props: { content: "处理", placement: "bottom", enterable: false, effect: "light", }, class: "item", }, [ h("i", { props: {}, class: "el-icon-edit", on: { click: () => { console.log(params.row); }, }, }), ] ), ] ); }, }, { prop: "date", label: "日期", minwidth: 150, sortable: "custom", }, { prop: "name", label: "姓名", minwidth: 150, sortable: "custom", }, { prop: "address", label: "地址", minwidth: 150, sortable: "custom", }, ], operateTableOption: { stripe: true, // 是否为斑马纹 table highlightCurrentRow: true, // 是否要高亮当前行 columnsSelect: true, maxHeight: 300, }, defaultColumns: ["操作", "日期", "姓名", "地址"], totalColumns: ["操作", "日期", "姓名", "地址"], //所有用户默认勾选的列 用于初始化 defaultSelectedColumn: [], }; }, methods: { //表头排序 sortChange(column, prop, order) { if (column.order === "ascending") { this.orderfield = column.prop; this.orderby = "ASC"; } else if (column.order === "descending") { this.orderfield = column.prop; this.orderby = "DESC"; } else { this.orderfield = ""; this.orderby = ""; } // this.getTabldHandle(); }, //保存自定义字段 saveSettingColumns(data) { console.log(data); }, }, mounted() {}, }; </script> <style> .tableView { width: 100%; height: 100%; } .content { padding: 60px; } .disableIcon { color: #c0c4cc; cursor: not-allowed; } </style>