父组件:Nav.vue

<template>
    <div>
        <el-menu
                default-active="1"
                background-color="#545c64"
                text-color="#fff"
                active-text-color="#ffd04b">
            <!-- 引入组件 -->
            <MenuTree :menuData="menuList"></MenuTree>
        </el-menu>
    </div>
</template>

<script>
    import {reactive, ref, isRef, toRefs, onMounted, watch, onUnmounted} from '@vue/composition-api';
    import MenuTree from "../../../components/MenuTree";

    export default {
        name: "Nav",
        components: {
            MenuTree: MenuTree
        },
        setup({root, refs,}, props) {
            const isCollapse = ref(true);

            const menuData = reactive('menuData')
            const menuList = reactive([{
                index: "1",
                name: "1",
                icon: 'el-icon-s-order',
                children: [{
                    index: "2",
                    name: "1-2",
                    icon: 'el-icon-s-order',
                    children: [{
                        index: "3",
                        name: "1-2-1",
                        icon: 'el-icon-s-order',
                    }, {
                        index: "4",
                        name: "1-2-2",
                        icon: 'el-icon-s-order',
                        children: [{
                            index: "5",
                            name: "1-2-2-1",
                            icon: 'el-icon-s-order',
                        }, {
                            index: "6",
                            name: "1-2-2-2",
                            icon: 'el-icon-s-order',
                            children: [{
                                index: "7",
                                name: "1-2-2-2-1",
                                icon: 'el-icon-s-order',
                            },{
                                index: "8",
                                name: "1-2-2-2-2",
                                icon: 'el-icon-s-order',
                            }]
                        }]
                    }],
                }]
            }, {
                index: "9",
                name: "2",
                icon: 'el-icon-s-order',
            }, {
                index: "10",
                name: "3",
                icon: 'el-icon-s-order',
            }, {
                index: "11",
                name: "4",
                icon: 'el-icon-s-order',
            }])


            const handleOpen = ((key, keyPath) => {
                console.log(key, keyPath);
            })

            const handleClose = ((key, keyPath) => {
                console.log(key, keyPath)
            })


            return {
                menuList,
                handleOpen,
                handleClose,
                menuData
            }
        }
    }
</script>

<style lang="scss" scoped>


</style>

 

子组件:MenuTree.vue

<template>
    <div>
        <template v-for="(menu,index) in menuData">
            <el-submenu :key="menu.index" :index="menu.index" v-if="menu.children" >
                <template slot="title">
                        <i :class="menu.icon"></i>
                        <span slot="title">{{menu.name}}</span>
                </template>
                <MenuTree :menuData="menu.children" ></MenuTree>
            </el-submenu>
            <el-menu-item :key="menu.index" :index="menu.index"   v-else>
                    <i :class="menu.icon"></i>
                    <span slot="title">{{menu.name}}</span>
            </el-menu-item>
        </template>
    </div>
</template>

<script>
    import {reactive, ref, isRef, toRefs, onMounted, watch, onUnmounted} from '@vue/composition-api';
    export default {
        name: "MenuTree",
        props: ['menuData'],
        components:{
        },
        setup({root}, props) {
            return {
                props,
            }
        }
    }
</script>

<style lang="scss" scoped>
    .bgc{
        background-color: #f56c6c;
    }

    .bgcChild{
        background-color: #f56c6c;
    }


</style>

 

效果:

 

posted on 2020-09-29 11:17  西门夜说  阅读(4596)  评论(0编辑  收藏  举报