实现思路
原本的正常表格的代码长这样:
<tr v-for="item in items"> <td width="3%">{{ $index + 1 }}</td> <td width="15%">{{item.bsO_Name}}</td> <td width="8%" :class="{"overtime": overtime(item.GathDt)}">{{item.GathDt | time}}</td> <td width="5%">{{item.F1}}</td> <td width="5%">{{item.F2}}</td> <td width="5%">{{item.F4}}</td> <td width="5%">{{item.F3}}</td> <td width="5%">{{item.F5}}</td> <td width="5%">{{item.F6}}</td> <td width="5%">{{item.F7}}</td> <td width="5%">{{item.F8}}</td> <td width="5%">{{item.F9}}</td> <td width="5%">{{item.F10}}</td></tr>先拿正常的表格来做测试,原生的
<td>
标签就有rowspan
属性支持单元格行合并,属性值指的是向下合并多少行,其实就相当于在本行中向下又添加了几个单元格。display: none;
css控制即可。<td>
标签需要带有两个属性值,rowspan
和display
来控制每一个单元格的合并行数和是否显示。<tr v-for="item in items"> <td width="3%">{{ $index + 1 }}</td> <td width="10%" :rowspan="item.bsO_Namespan" :class="{hidden: item.bsO_Namedis}">{{item.bsO_Name}}</td> <td width="8%" :rowspan="item.GathDtspan" :class="{hidden: item.GathDtdis}" :class="{overtime: overtime(item.GathDt)}">{{item.GathDt | time}}</td> <td width="5%" :rowspan="item.F1span":class="{hidden: item.F1dis}">{{item.F1}}</td> <td width="5%" :rowspan="item.F2span":class="{hidden: item.F2dis}">{{item.F2}}</td> <td width="5%" :rowspan="item.F3span":class="{hidden: item.F3dis}">{{item.F3}}</td> <td width="5%" :rowspan="item.F4span":class="{hidden: item.F4dis}">{{item.F4}}</td> <td width="5%" :rowspan="item.F5span":class="{hidden: item.F5dis}">{{item.F5}}</td> <td width="10%" :rowspan="item.F6span":class="{hidden: item.F6dis}">{{item.F6}}</td> <td width="8%" :rowspan="item.F7span":class="{hidden: item.F7dis}" :class="{overtime: overtime(item.F7)}">{{item.F7 | time}}</td> <td width="5%" :rowspan="item.F8span":class="{hidden: item.F8dis}">{{item.F8}}</td> <td width="5%" :rowspan="item.F9span":class="{hidden: item.F9dis}">{{item.F9}}</td> <td width="5%" :rowspan="item.F10span":class="{hidden: item.F10dis}">{{item.F10}}</td> <td width="5%" :rowspan="item.F11span":class="{hidden: item.F11dis}">{{item.F11}}</td></tr>其中,这两个属性有一些特征:
rowspan
为>1的值,记录接下来的行数display
为true
rowspan
为1且display
为false
rowspan
为1且display
为true
rowspan
和display
,并且计算出rowspan
的值为rowspan
的值计算display
的值是否显示,最后将此改变后的数组输出。function combineCell(list) { for (field in list[0]) {var k = 0;while (k < list.length) { list[k][field + "span"] = 1; list[k][field + "dis"] = false; for (var i = k + 1; i <= list.length - 1; i++) {if (list[k][field] == list[i][field] && list[k][field] != "") { list[k][field + "span"]++; list[k][field + "dis"] = false; list[i][field + "span"] = 1; list[i][field + "dis"] = true;} else { break;} } k = i;} } return list;}总结
rowspan
和display
设置,kmp
的指针跳转判断相同字符串一样的原理。combineCell()
这个函数就可以将网络请求回来的数据进行过滤,附加上相应的值后再对vue监视的数组进行赋值操作就可以了。