开发过程中,很多产品经理都喜爱做些花里胡哨的表格展现,以下是一种常见的表格展现形式,看上去如同很简单,实现起来很简略,上面看看代码怎么实现
组件实现次要围绕vxe-talble-v3,这款基于vue的表格框架能节俭很大的功夫
template
<template> <vxe-table border height="600" :scroll-y="{ enabled: false }" :span-method="rowspanMethod" :data="tableData" align="center" > <vxe-column field="sort" width="150" title="序号"></vxe-column> <vxe-column field="type" width="250" title="类型" :formatter="formatterType"> </vxe-column> <vxe-colgroup title="验收我的项目" v-if="deepLevel>0"> <vxe-column v-for="(item,idx) in deepLevel" :key="idx" :field="`name${item}`" header-class-name="header"></vxe-column> </vxe-colgroup> <vxe-column field="content" type="html" width="350" title="设计规范要求及标准规定"> <template #default="{ row }"> <div class="cellContent" v-if="XEUtils.isArray(row.content)"> <p @click="cellLink(item)" v-for="(item,idx) in row.content" :key="idx"><i class="el-icon-paperclip icon"></i><span class="link">{{item.provisions_info}}</span></p> </div> <span v-else>{{row.content}}</span> </template> </vxe-column> </vxe-table></template>js
import XEUtils from "xe-utils";export default { data() { return { tableData: [], acceptance_item: [], deepLevel:0, XEUtils:XEUtils }; }, created() { setTimeout(() => { // 获取api数据 this.acceptance_item = this.getData(); this.acceptance_item.forEach((item,idx)=>{ item.sort = idx+1+'' }) let that = this; // 遍历api树形构造层数,标记最深层 function arrLevel(arr,lv){ if(!arr || !arr.length) return; arr.forEach(item=>{ that.deepLevel = lv>that.deepLevel?lv:that.deepLevel; if(item.children && item.children.length){ arrLevel(item.children,lv+1) } }) } // 标记最深层赋值,vxetable在渲染进来 arrLevel(this.acceptance_item,1) console.log(this.deepLevel) this.toColTreeData(this.acceptance_item) }, 2000); }, methods: { // 将一般树结构转换为横向树列表 toColTreeData(treeData) { const options = { children: "children" }; const list = []; const keyMap = {}; XEUtils.eachTree( treeData, (item, index, result, paths, parent) => { item, index, result, paths, parent; keyMap[item.uid] = item; item.keys = parent ? parent.keys.concat([item.uid]) : [item.uid]; if (!item.children || !item.children.length) { const row = {}; item.keys.forEach((key, index) => { const level = index + 1; const obj = keyMap[key]; row[`id${level}`] = obj.uid; // 第1层赋值序号和类型 if(level==1){ row.sort = obj.sort row.type = obj.type } // content外面层会笼罩里面层 let content = obj.content?obj.content:obj.provisions row.content = content; // name遍历整个构造的所有name row[`name${level}`] = obj.name }); list.push(row); } }, options ); this.keyMap = keyMap; console.log(list) this.tableData = list }, formatterType ({ cellValue }) { return cellValue==1?"主控我的项目": cellValue == 2? "个别我的项目":"" }, cellLink(e){ debugger }, // 通用行合并函数(将雷同多列数据合并为一行) rowspanMethod({ row, _rowIndex, column,_columnIndex, visibleData }) { let that = this; let arr = [] for(let i=0;i<this.deepLevel;i++){ arr.push(`name${i+1}`) } const fields =[...arr,...["type","sort"]]; const cellValue = row[column.property]; if (cellValue && fields.includes(column.property)) { const prevRow = visibleData[_rowIndex - 1]; let nextRow = visibleData[_rowIndex + 1]; if (prevRow && prevRow[column.property] === cellValue) { return { rowspan: 0, colspan: 0 }; } else { let countRowspan = 1; while (nextRow && nextRow[column.property] === cellValue) { nextRow = visibleData[++countRowspan + _rowIndex]; } if (countRowspan > 1) { return { rowspan: countRowspan, colspan: 1 }; } } } // 用point标记name+'n' let point = '' Object.keys(row).forEach(item=>{ if(item.indexOf('name')>-1 && item != `name${that.deepLevel}`){ point = item; } }) // point 与 column.property 相等时,操作以后单元格横移拉伸 if(point == column.property && !row[`name${that.deepLevel}`]){ return { rowspan: 1, colspan: this.deepLevel - ( parseInt(point.split('name')[1]) - 1 ) } } // 将undefined的单元格暗藏 if(cellValue==undefined){ return { rowspan: 0, colspan: 0 } } }, getData(){ const data = [{ id: 10, uid: "317218091849220096", puid: "0", type: 1, name: "1", content: "钢筋", provisions: [ { provisions_id: "", provisions_info: "", specification_id: "", }, ], children: [ { id: 9, uid: "317218091849220097", puid: "317218091849220096", type: 0, name: "1.1", content: "", provisions: [ { provisions_id: "1", provisions_info: "钢筋", specification_id: "1", }, { provisions_id: "2", provisions_info: "混凝土", specification_id: "1", }, ], children: [], }, { id: 9, uid: "317218091849220200", puid: "317218091849220096", type: 0, name: "1.2", content: "", provisions: [ { provisions_id: "3", provisions_info: "钢筋1", specification_id: "1", }, { provisions_id: "4", provisions_info: "混凝土1", specification_id: "1", }, ], children: [], }, { id: 10, uid: "317218091849220201", puid: "317218091849220096", type: 0, name: "1.3", content: "", provisions: [ { provisions_id: "5", provisions_info: "钢筋2", specification_id: "1", }, { provisions_id: "6", provisions_info: "混凝土2", specification_id: "1", }, ], children: [ // { // id: 11, // uid: "317218091849220202", // puid: "317218091849220201", // type: 0, // name: "1.3.1", // content: "个别323", // provisions: [ // { // provisions_id: "", // provisions_info: "", // specification_id: "", // }, // ], // children: [], // }, ], }, ], }, { id: 13, uid: "317218091849220098", puid: "0", type: 2, name: "2", content: "", provisions: [ { provisions_id: "", provisions_info: "", specification_id: "", }, ], children: [ { id: 12, uid: "317218091849220099", puid: "317218091849220098", type: 0, name: "2.1", content: "", provisions: [ { provisions_id: "", provisions_info: "", specification_id: "", }, ], children: [ { id: 11, uid: "317218091849220100", puid: "317218091849220099", type: 0, name: "2.1.1", content: "个别", provisions: [ { provisions_id: "", provisions_info: "", specification_id: "", }, ], children: [], }, { id: 11, uid: "317218091849220101", puid: "317218091849220099", type: 0, name: "2.1.2", content: "个别", provisions: [ { provisions_id: "", provisions_info: "", specification_id: "", }, ], children: [], }, ], }, ], }] return data } },};scss
...