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


Posted in Javascript onJuly 31, 2017

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

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

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

html代码

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

组件模板代码

<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代码

/* 数据结构 */
    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代码

.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;
    }

总结

以上所述是小编给大家介绍的Vue组件模板形式实现对象数组数据循环为树形结构,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
复制本贴标题和地址的js代码
Jul 01 Javascript
javascript得到XML某节点的子节点个数的脚本
Oct 11 Javascript
添加JavaScript重载函数的辅助方法2
Jul 04 Javascript
关于全局变量和局部变量的那些事
Jan 11 Javascript
js中function()使用方法
Dec 24 Javascript
微信小程序 form组件详解及简单实例
Jan 10 Javascript
AngularJs上传前预览图片的实例代码
Jan 20 Javascript
angularjs+bootstrap菜单的使用示例代码
Mar 07 Javascript
bootstrap IE8 兼容性处理
Mar 22 Javascript
详解vue-cli下ESlint 配置说明
Sep 03 Javascript
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
Jul 19 Javascript
ES6新特性:使用export和import实现模块化详解
Jul 31 #Javascript
node koa2实现上传图片并且同步上传到七牛云存储
Jul 31 #Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
Jul 31 #Javascript
详解React中的组件通信问题
Jul 31 #Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
Jul 31 #Javascript
Angular.js中数组操作的方法教程
Jul 31 #Javascript
BootStrap导航栏问题记录
Jul 31 #Javascript
You might like
基于mysql的bbs设计(二)
2006/10/09 PHP
实用函数8
2007/11/08 PHP
劣质的PHP代码简化
2010/02/08 PHP
用PHP实现 上一篇、下一篇的代码
2012/09/29 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
dwr spring的集成实现代码
2009/03/22 Javascript
单独使用CKFinder选择图片的方法
2010/08/21 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
react基本安装与测试示例
2020/04/27 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
python计算auc指标实例
2017/07/13 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
python批量处理文件或文件夹
2020/07/28 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
个人授权委托书范文
2014/09/21 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
JavaScript实现复选框全选功能
2021/04/11 Javascript
Java基础之this关键字的使用
2021/06/30 Java/Android
php png失真的原因及解决办法
2021/10/24 PHP