• 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;
          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{
           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;
        }
  • 相关阅读:
    redis对string进行的相关操作
    bs4解析库
    redis对键进行的相关操作
    python常见的函数和类方法
    一些(也许)有用的技巧以及注意事项
    【复健内容】NOIP2020 题解
    类欧几里得的一个方法
    UOJ Round #12
    Goodbye Yiwei
    UOJ Round #11
  • 原文地址:https://www.cnblogs.com/csjoz/p/15345761.html
Copyright © 2020-2023  润新知