完美实现Element 树状表格
看效果
看代码
<el-table border :data="tableData" style="width: 100%"> <el-table-column prop="date" label="日期" width="300"> <template slot-scope="scope"> <div @click="treeClick(scope.row,scope.$index)" style="cursor: pointer;"> <template v-if="scope.row.children && scope.row.children.length > 0"> <i class="el-icon-arrow-down" :style="margin-left:+(scope.row.level-1)*2+em;" v-if="scope.row.open"></i> <i class="el-icon-arrow-right" :style="margin-left:+(scope.row.level-1)*2+em;" v-else></i> <span >{ { scope.row.date }}</span> </template> <span v-else :style="margin-left:+(scope.row.level-1)*2+em;">{ { scope.row.date }}</span> </div> </template> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> </el-table> <script> var util = {}; util.treeTableXcode = function(data,xcode){ xcode = xcode || ""; for(var i=0;i<data.length;i++){ var item = data[i]; item.xcode = xcode + i; if(item.children && item.children.length > 0){ util.treeTableXcode(item.children,item.xcode+"-"); } } }; new Vue({ el: "#app", data: function(){ var tableData = [{ id:"1", date: 2016-05-02, name: 王小虎, level:1, address: 上海市普陀区金沙江路 1518 弄, children:[{ id:"11", date: 2016-05-02, name: 王小虎, level:2, address: 上海市普陀区金沙江路 1518 弄, children:[{ id:"111", date: 2016-05-02, name: 王小虎, level:3, address: 上海市普陀区金沙江路 1518 弄 },{ id:"112", level:3, date: 2016-05-02, name: 王小虎, address: 上海市普陀区金沙江路 1518 弄 },{ id:"113", level:3, date: 2016-05-02, name: 王小虎, address: 上海市普陀区金沙江路 1518 弄 }] },{ id:"12", level:2, date: 2016-05-02, name: 王小虎, address: 上海市普陀区金沙江路 1518 弄 },{ id:"13", level:2, date: 2016-05-02, name: 王小虎, address: 上海市普陀区金沙江路 1518 弄 }] }, { id:"2", level:1, date: 2016-05-04, name: 王小虎, address: 上海市普陀区金沙江路 1517 弄 }, { id:"3", level:1, date: 2016-05-01, name: 王小虎, address: 上海市普陀区金沙江路 1519 弄 }, { id:"4", level:1, date: 2016-05-03, name: 王小虎, address: 上海市普陀区金沙江路 1516 弄 }]; util.treeTableXcode(tableData); var data = { tableData: tableData } return data; } , methods: { menuAdd: function() { }, treeClick:function(item,index){ if(item.open){ this.collapse(item,index); }else{ this.expand(item,index); } }, expand:function(item,index){ if(!item.children){ return index; } //展开 for(var i=0;item.children && i<item.children.length;i++){ var child = item.children[i]; this.tableData.splice(++index,0,child); if(child.children && child.children.length > 0 && child.open){ index = this.expand(child,index); } } item.open = true; return index; }, collapse:function(item,index){ if(!item.children){ return index; } //收缩 item.open = false; var len = 0; for(var i=index+1;i<this.tableData.length-1;i++){ var xcode = this.tableData[i].xcode; if(xcode.startsWith(item.xcode+"-")){ len ++; }else{ break; } } this.tableData.splice(index+1,len); } } }); </script>