导读: 此文章用于实现列的隐藏或显示 用的jquery,vue 或 react 思路一致,事件改变数据,数据影响视图~

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Table列展开与收起Demo</title>
  <style>
    th,
    td {
      width: 100px;
      text-align: center;
    }
  </style>
</head>

<body>
  <table id="myTable" border="1" cellpadding="0" cellspacing="0">
    <thead>
    </thead>
    <tbody>
    </tbody>
  </table>
  <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
  <script>
    /** 
     * mock数据
     * btn: 描述该字段用于点击按钮
     * flage: 用于描述该字段会根据按钮的点击显示 隐藏状态会发生改变
     * isShow: 用于决定该字段是否用于渲染
     */
    var header = [
      { value: '666', isShow: true },
      { value: '收起', isShow: true, btn: true },
      { value: '子集1', isShow: true, flage: true },
      { value: '子集2', isShow: true, flage: true },
      { value: '666', isShow: true },
      { value: '666', isShow: true },
      { value: '666', isShow: true }
    ]
    var bodys = [
      {
        datas: [
          { value: '777', isShow: true },
          { value: '777', isShow: true },
          { value: '子集td1', isShow: true, flage: true },
          { value: '子集td2', isShow: true, flage: true },
          { value: '777', isShow: true },
          { value: '777', isShow: true },
          { value: '777', isShow: true }]
      },
      {
        datas: [
          { value: '777', isShow: true },
          { value: '777', isShow: true },
          { value: '子集td1', isShow: true, flage: true },
          { value: '子集td2', isShow: true, flage: true },
          { value: '777', isShow: true },
          { value: '777', isShow: true },
          { value: '777', isShow: true }]
      },]

    // 初始化定义两段html
    var headerHtml
    var bodysHtml

    // 渲染函数
    function renderHtml() {
      $('#myTable thead').empty()
      $('#myTable tbody').empty()
      headerHtml = $('<tr>')
      // 渲染thead
      header.forEach((v, i) => {
        var tds
        if (v.btn) {
          tds = `<td><a href='javascript:void(0)' class='extend'>${v.value}</a></td>`
        } else {
          if (v.isShow) {
            tds = `<td>${v.value}</td>`
          }
        }
        headerHtml.append(tds)
      })

      // 渲染tbody
      bodys.forEach((v, i) => {
        bodysHtml = $('<tr>')
        v.datas.forEach((item, idx) => {
          var tds
          if (item.isShow) {
            tds = `<td>${item.value}</td>`
          }
          bodysHtml.append(tds)
        })
        $('#myTable tbody').append(bodysHtml)
      })
      $('#myTable thead').append(headerHtml)
    }

    // 执行第一次渲染
    renderHtml()

    // 展开或者收起按钮点击事件
    $('#myTable').on('click', '.extend', function () {
      if ($(this).text() === '收起') {
        // 改变header数据
        header = header.map((v, i) => {
          if (v.flage || v.flage === false) {
            v.isShow = false
            return v
          } else if(v.btn){
            v.value = '展开'
            return v
          } else {
            return v
          }
        })
        // 改变bodys数据
        bodys = bodys.map((v, i) => {
          v.datas.map((item, idx) => {
            if(item.flage){
              item.isShow = false
              return item
            } else {
              return item
            }
          })
          return v
        })
      } else {
        // 改变header数据
        header = header.map((v, i) => {
          if (v.flage || v.flage === false) {
            v.isShow = true
            return v
          } else if(v.btn){
            v.value = '收起'
            return v
          } else {
            return v
          }
        })
        // 改变bodys数据
        bodys = bodys.map((v, i) => {
          v.datas.map((item, idx) => {
            if(item.flage){
              item.isShow = true
              return item
            } else {
              return item
            }
          })
          return v
        })
      }
      // 重新渲染
      renderHtml()
    })
  </script>
</body>

</html>
posted on 2019-12-06 23:00  佑之以航  阅读(1735)  评论(0编辑  收藏  举报