vue+element+unocss 创建动态收缩菜单

知识要点
  • unocss使用
  • 动态菜单,可用于菜单权限分配
  • provide/inject
unocss项目中配置

跟着官网基本都可以完成配置

动态菜单

我这里用的elementPlus,其他框架原理都一样

<el-menu
	:unique-opened="true"
	background-color="#080D43"
	:collapse="obj.isCollapse"
	router
	active-text-color="#000"
	class="el-menu-vertical-demo border-0"
	:default-active="activeName"
	text-color="#fff"
	>
	<template v-for="item in menuList" :key="item.id">
	  <el-sub-menu :index="item.id" v-if="item.children && item.children.length > 0">
	    <template #title>
	      <svg class="icon" aria-hidden="true" style="width: 30px; height: 30px">
	        <use xlink:href="#icon-xiaoxi"></use>
	      </svg>
	      <span :class="obj.isCollapse ? '' : 'ml-5'">{{ item.menuName }}</span>
	    </template>
	    <el-menu-item
	      :index="subItem.id"
	      v-for="subItem in item.children"
	      :key="subItem.id"
	      :route="{ name: subItem.name }"
	    >
	      <svg class="icon" aria-hidden="true" style="width: 30px; height: 30px">
	        <use xlink:href="#icon-xiaoxi"></use>
	      </svg>
	      <span class="ml-5"> {{ subItem.menuName }}</span>
	    </el-menu-item>
	  </el-sub-menu>
	  <el-menu-item :index="item.id" :route="{ name: item.name }">
	    <svg class="icon" aria-hidden="true" style="width: 30px; height: 30px">
	      <use xlink:href="#icon-xiaoxi"></use>
	    </svg>
	    <span :class="obj.isCollapse ? '' : 'ml-5'"> {{ item.menuName }}</span>
	  </el-menu-item>
	</template>
</el-menu>
  • 下边是菜单数据
import { ref, inject } from 'vue'
const obj: any = inject('obj')
const activeName = ref('1')
const menuList = ref([
  { id: '1', menuName: '工作台', name: 'Home', path: '/' },
  {
    id: '2',
    menuName: '物业管理',
    name: 'Manger',
    path: '/manger',
    children: [
      { id: '2-1', menuName: '房屋信息', name: 'Housing', path: '/manger/housing' },
      { id: '2-2', menuName: '业主信息', name: 'Housing', path: '/manger/housing' },
      { id: '2-3', menuName: '车辆信息', name: 'Housing', path: '/manger/housing' }
    ]
  }
])
provide/inject

因为我这里需要做一个菜单收缩伸展的功能,功能分的也比较细,所以采用了隔代传值

// 父组件
import { ref, provide, watch } from 'vue'
const obj = ref({
  name: 'ZCY',
  isCollapse: true
})
// 初始化标题
const changeObj = () => {
  if (obj.value.isCollapse) {
    obj.value.name = 'ZCY'
  } else {
    obj.value.name = 'ZCY物业管理系统'
  }
}
provide('obj', obj)
  • 修改inject 传递的值
// 子组件
import { inject } from 'vue'
const obj: any = inject('obj')
const changeCollapse = () => {
  obj.value.isCollapse = !obj.value.isCollapse
}
  • 当然我们也要对这个值进行观察,变化时候更改
// 父组件
import { ref, provide, watch } from 'vue'
const obj = ref({
  name: 'OKM',
  isCollapse: true
})
watch(
  () => obj.value.isCollapse,
  () => {
    changeObj()
  },
  { deep: true }
)
// 初始化标题
const changeObj = () => {
  if (obj.value.isCollapse) {
    obj.value.name = 'OKM'
  } else {
    obj.value.name = 'OKM物业管理系统'
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web:小源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值