vue組件橫向樹實現

將之前的用css3+jq實現的橫向樹樣式簡單封裝成組件使用到vue項目中,文件名爲transverseTree.vue

代碼:

<template>
    <div class="tree">
        <ul v-if="treeData && treeData.length">
            <li v-for="(column,index) in treeData">
                <span class="root">{{column.name}}</span>
                <ul v-if="column.children && column.children.length">
                    <li v-for="(childrenColumn,index) in column.children">
                        <span>{{childrenColumn.name}}</span>
                        <ul v-if="childrenColumn.children && childrenColumn.children.length">
                            <li v-for="(grandChildrenColumn,index) in childrenColumn.children">
                                <span>{{grandChildrenColumn.name}}</span>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
</template>
<script>
  export default {
    name: 'transverseTree',
    props: {
        treeData:{
            type:Array,
            default:[]
        }
    },
    methods: {
        editDom(){
            if($('.root').siblings('ul').children('li').length==1){
                let num = 26*($('.root').siblings('ul').children('li').find('li').length-1);
                $('.root').css({ 'top': num });
                $('.root').siblings('ul').children('li').css({ 'top': num });
                $('.root').siblings('ul').find('ul').css({ 'top': -num });
                if($('.root').siblings('ul').find('li').length > 1){
                    $('.root').siblings('ul').children('li').children('span').addClass('hasChild');
                }
            }else{
                $('.root').css({ 'top': 26 * ($('.root').siblings('ul').children('li').length - 1) });
            }
        }
    },
    mounted() {
        this.$nextTick(()=>{
            this.editDom();
        });
    }
  };
</script>
<style scope>
.tree{
    position: relative;
    margin: -16px -16px 0;
    min-height: 400px;
    padding-left: 11px;
    overflow: auto;
}
.tree ul{
    width: 210px;
    height: 100%;
    position: absolute;
}
.tree ul ul{
    left: 226px;
    top: 0;
}
.tree li{
    float: left;
    list-style-type: none;
    position: relative;
    padding: 16px 5px 0 5px;
}
.tree li span{
    position: relative;
    display: inline-block;
    width: 200px;
    height: 36px;
    background: #F0F0F5;
    border-radius: 4px;
    text-decoration: none;
    color: #2D2D2D;
    font-size: 14px;
    line-height: 36px;
    text-align: center;
}

.tree li::before{
    box-sizing:inherit;
    content: '';
    position: absolute;
    top: 33px;
    left: -7px;
    border-top: 2px solid #D2D2D7;
    width: 12px;
}
.tree li::after{
    box-sizing:inherit;
    content: '';
    position: absolute;
    top: 8px;
    left: -9px;
    height: 100%;
    border-left: 2px solid #D2D2D7;
}
.tree li:first-child::after{
    height: 51%;
    border-left: 2px solid #D2D2D7;
    border-top: 2px solid #D2D2D7;
    top: 33px;
    width: 1px;
    border-top-left-radius: 4px;
}
.tree li:last-child::after{
    height: 25px;
    border-left: 2px solid #D2D2D7;
    border-bottom: 2px solid #D2D2D7;
    top: 8px;
    width: 1px;
    border-bottom-left-radius: 4px;
}
.tree li:only-child::after,
.tree li:only-child::before{
    display: none;
}
.tree ul ul li:only-child::before{
    display: inline-block;
}
.tree ul ul li:only-child span::before{
    display: inline-block;
}
.tree li:only-child span.root::before,.tree li:only-child span.hasChild::before{
    content: '';
    position: absolute;
    top: 17px;
    right: -14px;
    border-top: 2px solid #D2D2D7;
    width: 14px;
}
.tree ul ul ul li:only-child span::before{
    content: '';
    position: absolute;
    top: 17px;
    left: -26px;
    border-top: 2px solid #D2D2D7;
    width: 26px;
}
</style>

在父組件中使用import引入該組件:

import transverseTree from './transverseTree'

註冊組件:

components: { ifbpInfolistCard,transverseTree },

在template中使用:

<transverse-tree :treeData='treeData'></transverse-tree>

其中,treeData爲一個數組,在data中給treeData一個初始值:

treeData: [

{name:'報表名稱1',

children:[

{name:'功能名稱1',

children:[

{name:'磁貼名稱1'}

]},

{name:'功能名稱2',

children:[

{name:'磁貼名稱1'}

]},

{name:'功能名稱3',

children:[

{name:'磁貼名稱1'}

]},

]}

]

實現效果:

ps:需要特別說明的是,我目前的代碼暫時只支持這兩種樣式,即:

1父節點-1子節點-1/多孫節點,或是1父節點-多子節點-1孫節點,樣式是通過jq去判斷修改的,以後有時間的話再去研究優化爭取可複用性強一些。希望對大家能有所幫助。

歡迎交流討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章