中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何將ElementUI表格變身成樹形表格

發布時間:2021-07-28 10:26:36 來源:億速云 閱讀:221 作者:小新 欄目:web開發

這篇文章給大家分享的是有關如何將ElementUI表格變身成樹形表格的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

由于ElementUI目前還未開發樹形表格組件,也參閱了網絡上部分基于ElementUI表格封裝的開源樹形組件,如果想進行二次開發的話都不太理想,所以就萌生了自行開發樹形表格。

本示例提供開發思路,移除了多余的樣式,比較適合新手入門學習,如果應用于實際項目還請自行封裝。

目前還僅僅實現了視覺的樹結構的層級效果和控制結構的顯示隱藏,后續還會進行不斷的完善和優化,有必要的話會對組件進行二次封裝,有點在重復造論的感覺哈。

效果圖

如何將ElementUI表格變身成樹形表格

完整代碼

頁面(tree-table.vue)

<template>
 <div>
  TreeTable
  <el-table :data="list" :row- border>
   <el-table-column type="selection" width="55"></el-table-column>
   <el-table-column prop="id" label="ID" width="180">
    <template slot-scope="scope">
     <span class="collapse"
        :class="collapseClass(scope.row)"
        :
        @click="handleCollapseClick(scope.row)">
     </span>
     <span>{{ scope.row.id }}</span>
    </template>
   </el-table-column>
   <el-table-column prop="name" label="NAME"></el-table-column>
  </el-table>
 </div>
</template>

<script lang="ts">
  import {Component, Vue} from 'vue-property-decorator'
  // 引入兩個封裝好的工具方法
  import { arrayToTree } from './utils/array.js'
  import { ergodicTree } from './utils/tree.js'

  @Component
  export default class TreeTable extends Vue {
    private list: object[] = [];
    private tree: object[] = [];

    created() {
      // 準備一組含有父子級關系的一維數組方便示例測試
      // 在實際項目應用中,理應通過后端接口返回
      let _list = [
        {
          id: 'a',
          pid: '',
          name: '部門a',
          children: []
        },
        {
          id: 'a1',
          pid: 'a',
          name: '子部門a1',
          children: []
        },
        {
          id: 'a2',
          pid: 'a',
          name: '子部門a2',
          children: []
        },
        {
          id: 'a2-1',
          pid: 'a2',
          name: '子部門a2-1',
          children: []
        },
        {
          id: 'a2-2',
          pid: 'a2',
          name: '子部門a2-2',
          children: []
        },
        {
          id: 'a3',
          pid: 'a',
          name: '子部門a3',
          children: []
        },
        {
          id: 'a3-1',
          pid: 'a3',
          name: '子部門a3-1',
          children: []
        },
        {
          id: 'b',
          pid: '',
          name: '部門b',
          children: []
        },
        {
          id: 'b1',
          pid: 'b',
          name: '子部門b1',
          children: []
        },
        {
          id: 'c',
          pid: '',
          name: '部門c',
          children: []
        },
      ];
      
      // 將一維數組轉成樹形結構并存儲于tree變量
      this.tree = arrayToTree(_list);
      
      // 考慮到實際應用過程中接口返回的數據是無序的,所以我們對tree進行先序遍歷將節點一一插入到list變量
      this.list = [];
      ergodicTree(this.tree, (node: any) => {
        this.list.push(node);
        
        // 遍歷過程中并對每個節點掛載open和show屬性
        // open:控制節點的打開和關閉
        // show:控制節點的顯示和隱藏
        this.$set(node, 'open', true);
        this.$set(node, 'show', true)
      })
    }

    // 控制行的顯示和隱藏
    tableRowStyle(scope: any) {
      return {
        'display': scope.row.show ? '' : 'none'
      }
    }

    // 通過每個節點的深度,設置行的縮進實現視覺上的層級效果
    tableRowPaddingStyle(row: any) {
      return {
        'margin-left': `${(row._depth - 1) * 24}px`
      }
    }

    // 控制展開按鈕的展開和關閉狀態
    collapseClass(row: any) {
      return {
        'collapse--open': row.open == false && row.children && row.children.length > 0,
        'collapse--close': row.open == true && row.children && row.children.length > 0
      }
    }

    // 處理展開按鈕的點擊事件
    handleCollapseClick(row: any) {
      const _open = row.open;
      // 通過節點訪問路徑控制節點的顯示隱藏,由于內存指針的關系list和tree的節點操作都會相互影響
      ergodicTree(this.tree, (node: any) => {
        node._idPath.forEach((pathId: any) => {
          if (pathId == row.id) {
            this.$set(node, 'show', !_open);
            this.$set(node, 'open', !_open)
          }
        })
      });
      row.show = true;
      row.open = !_open;
    }
  }
</script>

<style lang="scss" scoped>
 .collapse {
  display: inline-block;
  width: 8px;
  cursor: pointer;
  margin-right: 8px;
 }

 .collapse--open:before {
  content: '+';
 }

 .collapse--close:before {
  content: '-';
 }
</style>

工具方法

考慮數組轉樹和遍歷樹都是在實際項目中都是非常常用的,所以這邊對這兩個方法進行了封裝。

數組轉樹結構(./utils/array.ts)

export function arrayToTree(list: object[], props = {id: 'id', pid: 'pid', children: 'children'}) {
      let tree: object[] = [];
      let map: any = {};

      let listLength = list.length;
      for (let i = 0; i < listLength; i++) {
        let node: any = list[i];
        let nodeId: any = node[props.id];
        map[nodeId] = node;
      }

      for (let i = 0; i < listLength; i++) {
        let node: any = list[i];
        let nodePid: any = node[props.pid];
        let parentNode: any = map[nodePid];
        if (parentNode) {
          parentNode[props.children] = parentNode[props.children] || [];
          parentNode[props.children].push(node)
        } else {
          tree.push(node)
        }
      }

      return tree
    }

遍歷樹結構(./utils/tree.ts)

結合實際項目應用,我們采用了先序遍歷法對樹進行遍歷,為了方便在業務代碼里的應用,在遍歷過程中會對每個節點掛載節點訪問路徑 _idPath 屬性和節點深度 _depth 屬性。

export function ergodicTree(tree: object[], callback: any = () => {}, props = {id: 'id', pid: 'pid', children: 'children'}) {
      function _ergodicTree(tree: object[], parentIdPath?: any[], depth: number = 0) {
        const treeLength = tree.length;
        for (let i = 0; i < treeLength; i++) {
          let node: any = tree[i];
          const _idPath: any[] = parentIdPath ? [...parentIdPath, node[props.id]] : [node[props.id]];
          const _depth: number = depth + 1;
          node._idPath = _idPath;
          node._depth = _depth;
          callback(node);
          if (node[props.children] && node[props.children] instanceof Array) {
            _ergodicTree(node[props.children], _idPath, _depth)
          }
        }
      }

      _ergodicTree(tree);
      return tree;
    }

感謝各位的閱讀!關于“如何將ElementUI表格變身成樹形表格”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

商城县| 曲靖市| 湾仔区| 扎鲁特旗| 家居| 奉节县| 北辰区| 峨眉山市| 高安市| 平泉县| 邛崃市| 余江县| 清水县| 右玉县| 包头市| 南陵县| 利川市| 永福县| 丹巴县| 太白县| 小金县| 获嘉县| 鹿邑县| 长丰县| 龙江县| 洛南县| 雅安市| 建阳市| 清原| 徐闻县| 萝北县| 岳普湖县| 通城县| 盐山县| 三门县| 广宗县| 万安县| 榕江县| 阿瓦提县| 高淳县| 盐边县|