Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)

 

数据结构为数组中包含对象--树形结构,用Vue组件的写法实现以下的效果:

Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)

树形列表,缩进显示层级,第5级数据加底色,数据样式显色,点击展开折叠数据。本文为用Vue实现方式,另有一篇为用knockout.js的实现方法。

html代码

1 2 3 <div id="table-component-div">   <table-component v-for="item in data1" v-bind:list="item"></table-component> </div>

组件模板代码

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <script type="text/x-template" id="table-component-template">   <div class="tem">     <div class="tem-p">       <div v-on:click="toggleClick"><i v-bind:style="{'visibility':list.number!=0?'visible':'hidden'}">{{list.number}}</i><span>{{list.name}}</span></div>       <!--绑定数据-->       <div><span>{{list.energyone}}</span></div>       <div><span>{{list.energytwo}}</span></div>       <div><span>{{list.energythree}}</span></div>       <!--绑定class,使数值显示出区分-->       <div><span v-bind:class="{'isgreen':list.huanRatio<0,'isred':list.huanRatio>100}">{{list.huanRatio}}<em>%</em></span></div>       <div><span v-bind:class="{'isgreen':list.tongRatio<0,'isred':list.tongRatio>100}">{{list.tongRatio}}<em>%</em></span></div>     </div>     <div class="tem-c">       <!-- 子组件 -->       <table-component v-for="itemc in list.child" :list="itemc"></table-component>     </div>   </div> </script>

JavaScript代码

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 /* 数据结构 */     var ko_vue_data=[       {         name: "总能耗",         number:"0",         energyone: 14410,         energytwo: 1230,         energythree: 1230,         huanRatio: -36.8,         tongRatio: 148.5,         child: [           {             name: "租户电耗",             number:"1",             energyone: 14410,             energytwo: 1230,             energythree: 1230,             huanRatio: -36.8,             tongRatio: 148.5,             child: []           },           {             name: "公共用电",             number:"2",             energyone: 14410,             energytwo: 1230,             energythree: 1230,             huanRatio: -36.8,             tongRatio: 148.5,             child: [               {                 name: "暖通空调",                 number:"2.1",                 energyone: 14410,                 energytwo: 1230,                 energythree: 1230,                 huanRatio: -36.8,                 tongRatio: 148.5,                 child: [                   {                     name: "冷站",                     number:"2.1.1",                     energyone: 14410,                     energytwo: 1230,                     energythree: 1230,                     huanRatio: -36.8,                     tongRatio: 148.5,                     child: [                       {                         name: "冷水机组",                         number:"2.1.1.1",                         energyone: 14410,                         energytwo: 1230,                         energythree: 1230,                         huanRatio: -36.8,                         tongRatio: 148.5,                         child: []                       }                     ]                   },                   {                     name: "热力站",                     number: "2.1.2",                     energyone: 14410,                     energytwo: 1230,                     energythree: 1230,                     huanRatio: -36.8,                     tongRatio: 148.5,                     child: []                   }                 ]               }             ]           }         ]       }     ];     /* 注册组件 */     Vue.component('table-component', {       template:"#table-component-template",//模板       props:['list'],//传递数据       computed:{//计算属性         isFolder: function () {//判断数据有没有子集,此效果中暂没用到,有需要的可以看下具体使用方式           return this.list.child && this.list.child.length > 0;         }       },       methods:{         /* 展开折叠操作 */         toggleClick:function(event){           event.stopPropagation();//阻止冒泡           var _this = $(event.currentTarget);//点击的对象           if (_this.parent().next().is(":visible")) {             _this.parent().next().slideUp();           } else {             _this.parent().next().slideDown();           }         }       }     });     /* 创建实例 */     new Vue({       el:"#table-component-div",//挂载dom       data:{         data1:ko_vue_data//数据       }     })

数据显示完毕,接下来是样式效果,缩进显示层级及底色显示。

css代码

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 .tem-p{       clear: both;       border-bottom: 1px solid #dddddd;       height: 30px;       line-height: 30px;       -webkit-box-sizing: border-box;       -moz-box-sizing: border-box;       box-sizing: border-box;     }     .tem-p>div{       float: left;       width:100px;       box-sizing: border-box;       -ms-text-overflow: ellipsis;       text-overflow: ellipsis;       white-space:nowrap;       overflow: hidden;       text-align: center;       -webkit-box-sizing: border-box;       -moz-box-sizing: border-box;       box-sizing: border-box;       height: 100%;       border-right: 1px solid #dddddd;     }     .tem-p>div:first-of-type{       width: 298px;       text-align: left;     }     .tem>.tem-c .tem-p>div:first-of-type{       padding-left: 30px;     }     .tem>.tem-c .tem-c .tem-p>div:first-of-type{       padding-left: 60px;     }     .tem>.tem-c .tem-c .tem-c .tem-p>div:first-of-type{       padding-left: 90px;     }     .tem>.tem-c .tem-c .tem-c .tem-c .tem-p>div:first-of-type{       padding-left: 120px;     }     .tem>.tem-c .tem-c .tem-c .tem-c .tem-p{       background-color: #f8f8f8;     }     .tem>.tem-c .tem-c .tem-c .tem-c .tem-c .tem-p>div:first-of-type{       padding-left: 150px;     }     .lastChild{       background: #f8f8f8;     }     .isred{       color: red;     }     .isgreen{       color: green;     }
上一篇:PTA 7-15 计算圆周率 (15 分)


下一篇:从上到下打印二叉树,层序遍历