vue3+typescrip通过组件传值实现菜单栏的收缩功能

最近在写一个后台管理的项目,功能实现是收缩菜单栏,如下图

 

以下是点击事件传递参数的代码

<template>
    <div class="header">
        <div class="fold-icon" @click="toggle">
            <el-icon v-if="!sidebarCollapse" :size="24" color="#909399">
                <fold />
            </el-icon>
            <el-icon v-else :size="24" color="#909399">
                <expand />
            </el-icon>
        </div>
    </div>
</template>

<script lang='ts'>
import { defineComponent, onMounted, reactive } from 'vue'
import { useRouter } from 'vue-router'
export default defineComponent({
    props: {
        sidebarCollapse: {
            type: Boolean,
            default: false,
        },
    },
    emits: ['update:sidebarCollapse'],
    setup(props, { emit }) {
        const router = useRouter()

        // TODO 用户信息变量,后续改成从store获取变量
        const userInfo = reactive({
            baseInfo: {},
        })

        // ↓sidebar折叠/展开的开关
        const toggle = () => {
            // ↓修改父组件值
            emit('update:sidebarCollapse', !props.sidebarCollapse)
        }
        return { userInfo, toggle }
    },
})
</script>

<style scoped lang="scss">
.header {
    display: flex;
    justify-content: space-between;
    // box-shadow: 3px 1px 4px 0px rgba(0, 0, 0, 0.1);

    .fold-icon {
        padding: 11px 13px;
    }
}
</style>

下面是菜单栏接收参数,控制icon变化的代码

<template>
    <div class="sidebar">
        <el-menu default-active="2" class="menu" :collapse="sidebarCollapse">
            <el-menu-item index="1">
                <el-icon>
                    <document />
                </el-icon>
                <span>Navigator Three</span>
            </el-menu-item>
        </el-menu>
    </div>
</template>

<script lang='ts'>
import { defineComponent, inject, onMounted, reactive, ref } from 'vue'
export default defineComponent({
    setup() {
        const sidebarCollapse: any = ref(inject('sidebarCollapse'))
        return {
            sidebarCollapse
        }
    },
})

</script>

<style scoped lang="scss">
.sidebar {
    height: 100vh;
    box-shadow: 2px 0px 6px 0px rgba(0, 0, 0, 0.1);

    .menu {
        border-right: unset;

        .logo {
            height: 50px;
            line-height: 50px;
            padding: 0 10px;
            overflow: hidden;

            img {
                vertical-align: middle;
                margin-left: 6px;
            }

            span {
                font-weight: bold;
                font-size: 16px;
            }
        }
    }

    .menu:not(.el-menu--collapse) {
        width: 240px;
    }
}
</style>

 以下是接收参数控制菜单栏长度变化

<template>
    <el-container>
        <Menu />
        <el-container>
            <el-header height="50px" style="box-shadow: 3px 1px 4px 0px rgba(0, 0, 0, 0.1);">
                <Header v-model:sidebar-collapse="sidebarCollapse" />
            </el-header>
            <el-main>
                <router-view></router-view>
            </el-main>
        </el-container>
    </el-container>
</template>

<script lang='ts'>
import { defineComponent, ref, provide } from "vue";
import Menu from "@/components/layout/Menu/index.vue";
import Header from "@/components/layout/header/index.vue";
export default defineComponent({
    components: { Menu, Header },
    setup() {
        // ↓侧边栏折叠
        const sidebarCollapse = ref(false)
        // ↓提供给sidebar注入
        provide('sidebarCollapse', sidebarCollapse)

        return {
            sidebarCollapse,
        }
    }
})
</script>

<style scoped lang="scss">
.el-header {
    padding: 0;
}

.el-main {
    text-align: center;
}
</style>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值