elementui 可伸缩侧边栏_Vue Element-UI 侧边栏高亮

我们在使用 vue + element 写后台管理模板时,肯定逃不过左侧菜单也称侧边栏。

举例:我们现在有一个 A 模块,A 模块中有详情页面和编辑页面【一共三个页面】,我们通常怎么考虑?将三个页面写在一个 vue 里,通过 v-if 等切换展示,使用一个路由。

写成三个 vue ,在 A 模块中引入编辑和详情,再注册和使用,使用一个路由。

写成三个 vue ,在路由里注册三个,通过切换路由实现,使用三个路由。

下面我们分析下这三种方式:

第一种:将三个页面写在一个 vue 里,导致代码量太大,过于臃肿,后期不好维护。

第二种:假设我们在详情页面刷新,我们当然期望还是停留在详情页而不是回到 A 模块,所以用组件包裹的形式不适合,如果是弹框可是刷新后关闭,如果是页面这样不合理。第一种也存在这个问题。

第三种:使用三个路由,各页面分开,刷新时互不干扰。

这样看来第三种会比较好,但是这样会遇到一个问题,当我们切换到详情页或编辑页时我们是期望 A 模块高亮,而不是取消高亮

element-ui 也给我们提供了一个属性 default-active

呀,看这个描述很是头痛啊,说的这是啥啥啥!完全看不懂,求助下度娘

度娘反馈回来的文章中说道

我之前并不是这么写的,我是在 route 的 meta 中加的配置,我看到这么简单就去试了试,发现还挺好用。看着貌似没有问题,但是当你直接在浏览器输入 url 时并不会更新过来【场景:当前 B 模块高亮,在 url 中输入一个 A 模块下的路由地址,虽然页面内容是正确的但是左菜单高亮不正确】

下面介绍我的方法:

首先在 route 的 index.js 中给需要改变高亮的路由增加 GuidePath 和 JumpPath 字段,GuidePath 表示当前路由高亮指向不是本身,JumpPath 表示高亮指向的路由企业注册、公司详情、编辑信息的高亮全部指向企业管理页面

然后在左菜单组件写 计算属性并赋值给 default-active属性

这样就大功告成了~

有人该有疑问了,为什么写在计算属性里?

因为左菜单作为一个组件被引入app.vue中只实例化一次,当我们切换路由的时候左菜单组件并不会被重新调用,所以我们需要计算属性实时监听,写在 watch 中也可以,但是写在计算属性中代码量比较少一行代码通俗易懂。实时的作用就是解决 url 输入也能改变高亮的问题。

感觉不错点个 赞留个关注吧。都是实战经验的干货哦~

你之前碰到这种问题是怎么样解决的呢?或者有什么更好的方法,欢迎评论,一起交流进步~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现一个无限级动态菜单树,可以使用 Element UI 的 Tree 组件。以下是一个简单的实现示例: 首先,需要在 Vue 中引入 Element UI 的 Tree 组件: ```javascript import { Tree } from 'element-ui'; ``` 然后,可以在 Vue 的模板中使用 `el-tree` 标签来渲染 Tree 组件: ```html <el-tree :data="menuData" :props="treeProps" @node-click="handleNodeClick"></el-tree> ``` 其中,`menuData` 是菜单数据,`treeProps` 是 Tree 组件的属性配置对象,`handleNodeClick` 是 Tree 组件的点击事件处理函数。 接下来,我们来看一下如何实现动态加载菜单数据。首先,需要在 Vue 的 `mounted` 生命周期中调用一个方法来获取菜单数据: ```javascript mounted() { this.getMenuData(); }, methods: { getMenuData() { // 通过接口获取菜单数据 } } ``` 接着,在菜单数据获取成功后,需要将数据转换成符合 Tree 组件要求的格式,并将数据保存在 Vue 实例的 `menuData` 属性中: ```javascript getMenuData() { // 通过接口获取菜单数据 // 将数据转换成符合 Tree 组件要求的格式 const menuData = convertMenuData(data); // 将数据保存在 Vue 实例的 menuData 属性中 this.menuData = menuData; } ``` 最后,我们来看一下如何处理 Tree 组件的点击事件。在 `handleNodeClick` 方法中,可以根据节点的 `level` 属性来判断当前节点是否为叶子节点。如果是叶子节点,则可以执行相应的操作,比如打开对应的页面;否则,需要递归获取子节点的数据并更新 Tree 组件的数据源: ```javascript handleNodeClick(node) { if (node.level === 2) { // 点击了叶子节点,执行相应操作 // 比如打开对应的页面 window.location.href = node.url; } else { // 点击了非叶子节点,递归获取子节点数据并更新 Tree 组件的数据源 const childNodes = await this.getChildNodes(node); node.children = childNodes; this.menuData = [...this.menuData]; } }, async getChildNodes(node) { // 通过接口获取子节点数据 const childNodesData = await getChildrenData(node.id); // 将数据转换成符合 Tree 组件要求的格式 const childNodes = convertMenuData(childNodesData); return childNodes; } ``` 至此,一个简单的无限级动态菜单树就实现了。完整的代码可以参考下面的示例: ```html <template> <el-tree :data="menuData" :props="treeProps" @node-click="handleNodeClick"></el-tree> </template> <script> import { Tree } from 'element-ui'; export default { components: { [Tree.name]: Tree }, data() { return { menuData: [], treeProps: { label: 'name', children: 'children' } }; }, mounted() { this.getMenuData(); }, methods: { async getMenuData() { // 通过接口获取菜单数据 const data = await getMenuData(); // 将数据转换成符合 Tree 组件要求的格式 const menuData = convertMenuData(data); // 将数据保存在 Vue 实例的 menuData 属性中 this.menuData = menuData; }, async handleNodeClick(node) { if (node.level === 2) { // 点击了叶子节点,执行相应操作 // 比如打开对应的页面 window.location.href = node.url; } else { // 点击了非叶子节点,递归获取子节点数据并更新 Tree 组件的数据源 const childNodes = await this.getChildNodes(node); node.children = childNodes; this.menuData = [...this.menuData]; } }, async getChildNodes(node) { // 通过接口获取子节点数据 const childNodesData = await getChildrenData(node.id); // 将数据转换成符合 Tree 组件要求的格式 const childNodes = convertMenuData(childNodesData); return childNodes; } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值