vue.js 树菜单 递归组件树来实现

参照前辈方法实现的,觉得不错,记录一下:

父组件:

<!-- 菜单树 -->
                <ul class="T_down" v-for="(menuItem,index) in customerArray" :key="index">
                    <tree-menu :treeData="menuItem"></tree-menu>
                </ul>

import treeMenu from ‘./treeMenu.vue‘

myMailTree: [
                {
                    id: 0,
                    label: ‘发件箱‘,
                    children: []
                },
                {
                    id: 1,
                    label: ‘收件箱‘,
                    children: [
                        {
                            id: 11,
                            label: ‘常用邮件‘,
                        },
                        {
                            id: 12,
                            label: ‘常用邮件‘,
                            children: [
                                {
                                    id: 11,
                                    label: ‘常用邮件‘,
                                    children: [
                                        {
                                            id: 11,
                                            label: ‘常用邮件‘,
                                        },
                                        {
                                            id: 12,
                                            label: ‘常用邮件‘,
                                            children: [
                                                {
                                                    id: 11,
                                                    label: ‘常用邮件‘,
                                                },
                                                {
                                                    id: 12,
                                                    label: ‘常用邮件‘,
                                                    children: [
                                                        {
                                                            id: 11,
                                                            label: ‘常用邮件‘,
                                                        },
                                                        {
                                                            id: 12,
                                                            label: ‘常用邮件‘,
                                                        },
                                                    ]
                                                },
                                            ]
                                        },
                                    ]
                                },
                                {
                                    id: 12,
                                    label: ‘常用邮件‘,
                                },
                            ]
                        },
                    ]
                },
                {
                    id: 3,
                    label: ‘草稿箱‘,
                },
            ],

 components: {
        ‘tree-menu‘: treeMenu
    },

子组件:

<template>
    <li>
        <h3>
            <i v-if="isFolder" @click="toggle" class="iconfont" :class="[open ? ‘icon-arrow-down‘: ‘icon-arrow-right‘]"></i>
            <span class="label">{{treeData.label}}
                <em>(99)</em>
            </span>
            <span class="T_set">
                <i class="iconfont icon-subordinate"></i>
                <i class="iconfont icon-subordinate"></i>
                <i class="iconfont icon-subordinate"></i>
            </span>
        </h3>
        <ul class="T_down" v-show="open" v-if="isFolder">
            <tree-menu v-for="item in treeData.children" :key="item.id" :treeData="item"></tree-menu>
        </ul>
    </li>
</template>

<script>
export default {
    name: ‘treeMenu‘,
    props: [‘treeData‘],
    data() {
        return {
            open: false
        }
    },
    computed: {
        isFolder() {
            return this.treeData.children && this.treeData.children.length
        }
    },
    methods: {
        toggle: function() {
            if (this.isFolder) {
                this.open = !this.open
            }
        }
    }
}
</script>

less

ul.T_down {
                    //菜单树
                    // border: 1px solid red;
                    background-color: #fff;
                    padding-left: 17px;
                    line-height: 35px;
                    li {
                        >h3 {
                            // border: 1px solid red;
                            font-weight: normal;
                            font-size: 14px;
                            padding-left: 23px;
                            cursor: default;
                            position: relative;
                            >i.iconfont {
                                display: block;
                                width: 23px;
                                height: 100%;
                                text-align: center;
                                font-size: 12px;
                                position: absolute;
                                left: 0;
                                top: 0;
                                &:hover {
                                    color: #008cee;
                                    cursor: pointer;
                                }
                            }
                            >span.label {
                                color: #555;
                                >em {
                                    font-size: 12px;
                                    font-style: normal;
                                    color: #888;
                                }
                            }
                            &:hover {
                                background-color: #ddd;
                                span.T_set {
                                    display: block;
                                }
                            }
                            span.T_set {
                                float: right;
                                margin-right: 10px;
                                display: none;
                                i.iconfont {
                                    display: inline-block;
                                    padding: 0 2px;
                                    font-size: 13px;
                                    &:hover {
                                        color: #008cee;
                                        cursor: pointer;
                                    }
                                }
                            }
                        }
                    }
                }

参考链接:

https://www.cnblogs.com/caihg/p/6208105.html

时间: 2024-10-14 11:12:36

vue.js 树菜单 递归组件树来实现的相关文章

在sublime 编辑器中,安装插件 Vue Syntax Hightlight,高亮识别Vue.js 的单文件组件(*.vue)

转自:http://www.cnblogs.com/cosnyang/p/6290950.html 默认情况下,Vue.js 的单文件组件(*.vue)在 sublime 编辑器中是不被识别的.若要想高亮显示,需要安装插件 Vue Syntax Hightlight.安装步骤如下: 第一,在 sublime 中打开 PackageControl 如下图,快捷键 Ctrl+Shift+P. 第二,打开 Install Package 窗口.下图中第一个,回车. 打开过程中,右下角出现状态栏.如下图

vue+elementUI 做的递归组件

废话少说,直接上最新鲜的干货 当然,你得提前安装好bootstrap,router,element-ui,vue-axios 1.上递归组件,此处参考了某位大神的代码,具体不知道是谁,因为到处都有人用 <template> <div> <template v-for='menu in menuList'> <!-- 如果当前有子菜单,则显示 el-submenu ,在el-subment 里调用 递归组件 --> <el-submenu v-if='m

Vue.js 基础学习之组件

什么是组件:组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展. 创建全局组件 <div id="seg1"> <alert></alert> </div> <div id="seg2"> <alert></alert>

vue.js中的全局组件和局部组件

组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能. 组件的使用有三个步骤: 1.创建组件构造器 2.注册组件 3.使用组件 先来看一段代码: <!DOCTYPE html> <html> <body> <div id="app"> <!-- 3. #app是Vue实例挂载的元素,应该在挂载元素范围内使

Vue.js的表格分页组件

转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋可以移步我的上一篇文章<浅谈Vue.js>了解一下. BootPage组件简介 其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件

基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多

通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无限滚动加载不需要写首次载入列表的函数, 代码如下: html: //父组件 <div v-infinite-scroll="loadMore" infinite-scroll-disabled="loading" infinite-scroll-distance=

Mint-ui(基于 Vue.js 的移动端组件库)的使用

官网: http://mint-ui.github.io/#!/zh-cn 1.安装包 npm install mint-ui -S 2.导包 import Vue from 'vue'import MintUi from 'mint-ui' // 导入全部组件import 'mint-ui/lib/style.css'Vue.use(MintUi) 3.css类mint-ui组建的使用 <template> <div>  <mt-button type="defa

基于Vue.js的表格分页组件

BootPage组件简介 其实也不是啥高大上的组件了,相反确实一个简单的表格分页组件而已,主要是自己最近项目中需要一个表格分页组件,而Vue官方组件库里分页组件都功能太强大或者没有适合我的,所以就自己写了一个凑合着用,或许有人和我一样需要这样一个简单的分页组件来实现简单的分页功能,我便在这里分享一下,大家自觉填坑咯. 如需高大上的组件,可以移步Vue官方组件库:https://github.com/vuejs/awesome-vue#libraries--plugins BootPage是一款支

vue.js的一个消息组件实例

<template> <div v-show="show" :class="`alert alert-${type} alert-dismissible`"> <button @click="close" type="button" class="close"><span>×</span></button> {{ msg }} <