Vue3结合element-ui实现导航菜单展开收缩小功能

1.导入方法(此处注册为全局,也可单独导入)

export function setupResizeObserver(type, div, func) {
  if (!div) return;
  let divElement = null;
  switch (type) {
    case "id":
      divElement = document.getElementById(div);
      break;
    case "className":
      divElement = document.querySelector("." + div);
      break;
    case "ref":
        divElement = div?.value || null; // 确保 div.value 是有效的元素
        break;
    default:
      divElement = null;
  }
  if (!divElement) return;

  // 创建 ResizeObserver 实例,监听div元素的大小变化时,执行函数
  const resizeObserver = new ResizeObserver(() => {
    func(divElement);
  });

  // 监听divElement元素的大小变化
  resizeObserver.observe(divElement);

  // 返回函数,用于在组件销毁前停止监听
  return () => {
    resizeObserver.disconnect();
  };
}

2.创建图表容器

  <div ref="chartRef" style="width: 100%;" :style="{ height: 100 + '%' }"></div>

3.获取标签绘制图表

const chartRef = ref();
let chart = null;

function init() {
  chart = echarts.init(chartRef.value);
  // 绘制图表
  chart.setOption(options.value);
}
function getChartHeight() {
  chart.resize();
}

4. 生命周期中使用 

onMounted(() => { 
  init();
  // div自适应-----------------开始
  // 监听div元素的大小变化时,水平,垂直方向刻度大小重置
  // 调用函数设置div的自适应
  const cleanupDiv = setupResizeObserver("ref", chartRef, getChartHeight)
  //   observeDivSizeInRealTime
  // 在组件销毁前调用cleanupDiv,停止监听div的大小变化
  onUnmounted(() => {
    cleanupDiv();
  });
  // div自适应-----------------结束
});、

### 使用 Element-UI 实现侧边导航栏 为了实现带有动态收缩展开功能的侧边导航栏,可以利用 Vue 2.x 和 Element-UI 提供的功能来完成。具体来说,通过 `el-menu` 组件以及一些自定义样式和逻辑控制,能够满足需求。 #### HTML 结构 首先,在模板部分定义好基本布局: ```html <template> <div class="layout"> <!-- 左侧菜单 --> <el-aside width="auto" style="background-color: rgb(50, 65, 87)"> <el-menu router :collapse="isCollapse" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b"> <!-- 动态加载菜单--> <sidebar-item v-for="(item,index) in routes" :key="index" :item="item"></sidebar-item> </el-menu> </el-aside> <!-- 右侧主体内容区 --> <el-container> ... </el-container> </div> </template> ``` 上述代码片段中引入了 `el-aside` 来作为左侧区域,并设置了背景颜色;而内部嵌套了一个 `el-menu` 菜单组件,其中包含了几个重要属性:`router`, `collapse`, `background-color`, `text-color`, `active-text-color`. 这些属性分别用来启用路由模式、切换收起状态、指定不同状态下文字的颜色等效果[^1]. #### JavaScript 部分 接着是在脚本文件里处理业务逻辑的地方: ```javascript <script> export default { name: &#39;Layout&#39;, computed:{ isCollapse(){ return this.$store.getters.sidebarOpened; }, routes() { return this.$router.options.routes.filter(route => !route.hidden); } }, } </script> ``` 这里主要做了两件事: - 计算属性 `isCollapse`: 获取 Vuex store 中存储的状态值决定是否要折叠侧边栏; - 方法 `routes()` :过滤掉隐藏不显示于菜单中的路径并返回给视图层使用. #### 样式调整 最后还需要适当修改 CSS 样式以适应页面设计的要求: ```css <style scoped lang="scss"> .layout{ height: 100%; } .el-menu-vertical-demo:not(.el-menu--collapse){ width: 200px; min-height: 400px; } // 解决element-ui中子选项长度有时会超出边框的问题 .over-hide { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } </style> ``` 以上就是基于 Vue.jsElement-UI 构建的一个简单但完整的例子,它不仅支持常规的操作还加入了更多实用特性比如动态改变宽度大小等功能[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值