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 相关文章推荐
JavaScript 入门基础知识 想学习js的朋友可以参考下
Dec 26 Javascript
Js获取事件对象代码
Aug 05 Javascript
javascript循环变量注册dom事件 之强大的闭包
Sep 08 Javascript
jquery datepicker参数介绍和示例
Apr 15 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
Mar 02 Javascript
JavaScript中的依赖注入详解
Mar 18 Javascript
jquery滚动特效集锦
Jun 03 Javascript
javascript实现的左右无缝滚动效果
Sep 19 Javascript
AngularJS递归指令实现Tree View效果示例
Nov 07 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
webpack 打包压缩js和css的方法示例
Mar 20 Javascript
JavaScript使用类似break机制中断forEach循环的方法
Nov 13 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
用Zend Encode编写开发PHP程序
2010/02/21 PHP
php抓取https的内容的代码
2010/04/06 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
JavaScript Eval 函数使用
2010/03/23 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
vue-axios使用详解
2017/05/10 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
python读写配置文件操作示例
2019/07/03 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
中科方德软件测试面试题
2016/04/21 面试题
银行实习人员自我鉴定
2013/09/22 职场文书
运动会开幕式邀请函
2014/01/22 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
车辆委托书范本
2014/10/05 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
离婚纠纷代理词
2015/05/23 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
java设计模式--七大原则详解
2021/07/21 Java/Android